일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 모의해킹
- load of sqlinjection
- CTF
- 암호해독
- 해킹도구
- 포트스캔
- 칼리리눅스
- Hacking
- 취약점
- web hacking
- smb
- 스캔
- Los
- 권한상승
- root권한
- Kioptrix
- 해킹툴
- 침투테스트
- SQLINJECTION
- 스캐닝
- Samba
- 해킹
- Metasploit
- 취약점 스캔
- 시스템 해킹
- sql
- 메타스플로잇
- SQL Injection
- 내부침투
- 취약점분석
- Today
- Total
감자 텃밭
[프로토스타] prostar - heap1 본문
이번에는 프로토스타의 heap1번 문제이다 이번 문제는 heap0번 문제보다 수준이 높아 보였다.
malloc와 포인터에 대해 좀 더 상세히 살펴봐야했다.
일단 해당 문제의 소스코드는 아래와 같다.
internet라는 구조체를 만들며 int형 priority와 char형 포인터 변수 name을 선언했다 또한 winner함수가 존재하며
main함수에는 구조체 포인터 i1, i2, i3를 선언하고
i1, i2에 각각 internet의 크기만큼 메모리를 할당해주고 있다 또한 priority에 1을 할당하고 name에는 또 8만큼의 메모리를 할당해주고 있다.
그 후 strcpy를 통해 i1포인터 구조체의 name변수에 argv [1]을 할당하고 그다음 strcpy함수에 의해
i2포인터 구조체의 name변수에 argv [2]를 할당한다 그 후 printf 함수를 통해 해당 문자열을 출력하는 듯하다
이 부분에서 bof가 일어날 것이다.!!!
해당 문제에 접근하기 위한 방법은 첫 번째 strcpy를 통해 bof를 일으켜 i2->name 위치에 접근하여 i2가 포인터로 가리키는 값을 printf함수의 got로 변조시킨 후 argv2의 값으로 winner함수의 주소를 넣으면 된다 그럼 got overwrite로 인해
printf함수가 실행될 때 printf가 아닌 winner함수가 실행될 것이다.
일단 입력값을 주고 메모리가 어떻게 할당되는지 확인했다.
-8 부분인 헤더 부분부터 출력시켜서 확인하였다 1 부분이 priority부분이고 그다음 부분에 name부분의 포인터 즉 41414141이 들어간 주소 값이 된다 확인해보니 일치하였다.
그럼 저 기부분을 쭉 더미 값으로 채운 후 42424242를 가리키는 포인터의 주소 값을 printf함수의 got로 변조 후
두 번째 argv [2] 값으로 winner함수의 주소를 넣으면 된다.
그럼 결론은 argv [1] = 20개의 더미 값 + printf got argv [2] = winner함수의 주소를 넣으면 될 것이다.
성공적으로 winner함수가 출력되는 것을 확인할 수 있었다
이번 문제는 조금 복잡하게 꼬여있었던 거 같지만 나름 재미있었다.
'protostar > heap' 카테고리의 다른 글
[프로토스타] protostar - heap2 (0) | 2021.08.16 |
---|---|
[프로토스타] protostar - heap0 (0) | 2021.08.10 |