일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Hacking
- 스캔
- 취약점분석
- 해킹툴
- load of sqlinjection
- SQL Injection
- smb
- 내부침투
- Los
- 스캐닝
- sql
- 칼리리눅스
- Kioptrix
- 해킹
- SQLINJECTION
- Metasploit
- 침투테스트
- 취약점 스캔
- 메타스플로잇
- web hacking
- CTF
- 취약점
- 시스템 해킹
- 모의해킹
- 권한상승
- root권한
- 포트스캔
- 암호해독
- 해킹도구
- Samba
- Today
- Total
감자 텃밭
[프로토스타] protostar - heap0 본문
이번에는 프로토스타에 heap0문제를 풀어보았다
힙에 대한 기본적인 지식을 요구하기에 heap에 대해 잘 몰랐지만 생각보다 재밌었던 문제이다.
기본적인 heap overflow문제인것 같았다.
일단 해당 프로그램의 소스코드를 보면
data와 fp 구조체를 선언하고 d와 p에 각각 data와 fp의 포인터를 선언한다 그 후 malloc를 통해 동적으로 메모리를 할당시킨다. 그 외에 winner와 nowinner라는 문자열을 출력해주는 함수가 있고 f->fp를 통해 nowinner함수를 fp구조체에 할당해주는 거 같다. 그 후 strcpy함수를 통해 d->name 즉 구조체 포인터 d에 argcv [1]의 값을 복사한다.
이 부분에서 bof 가 일어나는 듯하다. 그 후 fp구조체의 fp함수 포인터의 함수를 출력시킨다.
우리는 여기서 nowinner 함수가 아닌 winner함수를 출력해야 한다.
bof를 일으켜 fp의 함수 주소를 바꾸면 된다고 생각될 수 있겠지만 그러기 위해서는 heap의 구조를 알아야 한다
힙은 헤더인 4byte(type)+4byte(size)와 +data로 구성되어 있으며 포인터로 잡고 있을 때 가리키는 값은 헤더가 아닌
데이터 부분을 가리키고 있다.
일단 천천히 접근해보았다.
첫 번째 메모리 할당 부분인
16번 줄을 실행시키고 21번째 줄에 breakpoint를 잡은 후 확인해 보았다.
eax의 주소가 0x804a 1a 0이기에 제대로 되었는지 확인했다.
제대로 찾은 거 같다 저 주소 값에서 -8을 한 이유는 앞에서 말했듯이 데이터 앞부분에 총 8바이트만큼의 헤더 값이 붙으며 데이터의 입력받아 저장하는 부분을 가르 키기기 때문에 헤더부터 모두 확인하려면 -8한 위치를 확인하면 된다.
이제 입력값이 제대로 들어가는지 확인해 보자.
입력을 받을 수 있도록 102번을 실행한 후 인 107 부분에 breakpoint를 잡고 특정값을 입력 후 확인해 보았다.
eax값을 확인하고 정상적으로 AAAA가 들어갔다
제대로 들어간 거 같다.
A의 아스키코드값은 41414141이 들어갔고 그 뒤에를 보면 6번째 줄에 11은 fp구조체의 사이즈이다 그 후 나오는 것이
nowinner함수의 주소로 추측되어 확인해보았다.
예상과 같이 nowinner함수의 주소였다 그럼 우린 이 부분의 주소를 winner함수의 주소로 변조시키면 된다.
winner함수의 주소를 구해보았다.
그렇다면 이제 모든 건 다 구해졌다
우리가 입력받는 값부터 변조시키는 값까지의 거리를 계산해보면 80의 거리가 나온다
그럼 80개의 더미 값을 채운 후 winner의 주소를 넣으면 성공할 것이다.
성공!!!
heap에 대한 지식이 별로 없어 이해하더라도 설명하기에 많이 부족한 부분이 많았다.
좀 더 공부를 해야겠다.
'protostar > heap' 카테고리의 다른 글
[프로토스타] protostar - heap2 (0) | 2021.08.16 |
---|---|
[프로토스타] prostar - heap1 (0) | 2021.08.10 |