1. 보호기법 확인
$ checksec pwn2
2. IDA - pseudo code
s 변수(0x27 = 39 byte)에 입력받아서 select_func 함수의 src 매개변수로 받는다.
strncpy는 딱 31 바이트만 src를 dest로 복사한다. (dest 크기는 0x2a = 42 바이트)
이때 dest + SFP는 0x2a - 0xc = 30 바이트이다.
따라서 입력받는 길이는 31 바이트인데 dest + SFP의 크기는 30 바이트이므로 1 바이트 overflow가 발생한다.
이 1 바이트 overflow는 return address의 하위 1 바이트를 덮을 수 있다.
따라서 return address의 하위 1 바이트 변조로 흐름을 바꿀 수 있다.
이것을 off-by-one stack bufferoverflow 라고 한다.
3. 분석
strcmp을 해서 dest에 있는 문자열이 one이 아니면 eax에 담긴 주소를 call해서 이동하고 그 후에 main 함수로 리턴한다.
따라서 one이 아니더라도 원하는 곳으로 이동이 가능하다.
gets 함수 call 전 bp를 잡고 continue하고, eax 레지스터 값을 확인해보면 s 변수의 시작주소를 알 수 있다.
그리고 값을 넣고 s의 시작주소로 이동해보면 넣은 값들이 제대로 들어가있다.
하지만 보호기법으로 인해 주소가 유동적이다.
따라서 return address에 넣어서 이동하고 싶은 print_flag 함수 주소도 유동적이다.
print_flag 함수의 assembly code로 이동하면 offset이 나온다.
print_flag function offset : 0x6d8
NX, PIE가 걸려있어도 이 offset은 고정적이다.
따라서 return address의 하위 1 바이트에 넣을 값은 print_flag 함수의 offset 하위 1 바이트인 "\xd8"이다.
4. exploit code
5. exploit
[PlaidCTF 2013] ropasaurusrex (0) | 2019.08.15 |
---|---|
[HITCON-Training] lab5 : simplerop (0) | 2019.08.15 |
[TAMU 2019] pwn1 (0) | 2019.08.14 |
[TAMU 2018] pwn4 (0) | 2019.08.10 |
[HITCON-Training] lab3 : ret2sc (0) | 2019.08.10 |