1. 보호기법, 파일 유형 확인
32-bit 파일이며 보호기법 없다.
2. IDA로 pseudo code 확인 및 분석
- read(0, &name, 0x32u) : read 함수로 사용자로부터 딱 50 바이트만 입력받는다.
- gets(&s) : gets 함수로 s 변수에 입력받은 문자열 저장 -> overflow 취약점 발생
read 함수는 딱 주어진 50 바이트만 입력받으니 여기로 name 변수에 shellcode를 저장하고,
gets 함수로는 payload를 전달해서 return address에 &name 을 저장하면
ret 명령어로 해당 주소로 리턴 시 쉘코드를 실행할 수 있다.
이것이 return to shellcode 기법이다. (ret2sc = RETurn TO ShellCode)
pseudo code에서 name을 눌러서 &name으로 이동해보면 name 변수의 주소가 0x0404a060임을 알 수 있다.
그리고 ebp-14h 로 s 의 크기를 알 수 있다.
ebp-0x14 h = ebp-20 이므로 s의 크기는 20 바이트이다.
3. s 에서 return address 까지의 거리
bp 1 : main 함수 첫 번째 명령어 - 최상위 stack 주소 : return address 가짐
bp 2 : gets 함수 호출 명령어 (gets 함수 호출 전) - s 변수 주소
각 bp 에서 구한 주소의 차이로 s 에서 return address 까지 거리를 구할 수 있다.
(gdb) p/d 0xffffd5bc - 0xffffd59c
$1 = 32
s(20) + dummy(8) + SFP(4) = 32
임을 알 수 있다.
따라서 stack 구조는 s(20) + dummy(8) + SFP(4) + RET(4) 이다.
4. s 시작주소, return address 확인
예상대로 0xffffd59c로 출력해보면 딱 값을 넣은 부분에서 시작해서 값이 들어가있다.
0xffffd59c가 시작주소이다.
아까 bp 1에서 구한 0xffffd5bc 주소가 return address를 값으로 가지는데, 실제로 출력해보면 return address가 덮어진 것을 확인할 수 있다.
5. payload
6. exploit
[HITCON-Training] lab5 : simplerop (0) | 2019.08.15 |
---|---|
[TAMU 2019] pwn2 (0) | 2019.08.14 |
[TAMU 2019] pwn1 (0) | 2019.08.14 |
[TAMU 2018] pwn4 (0) | 2019.08.10 |
[TAMU 2018] pwn3 (0) | 2019.08.10 |