상세 컨텐츠

본문 제목

[TAMU 2019] pwn2

SYSTEM HACKING/CTF, etc

by koharin 2019. 8. 14. 20:47

본문

728x90
반응형

1. 보호기법 확인

 

$ checksec pwn2

 

2. IDA - pseudo code

 

main 함수

변수(0x27 = 39 byte)에 입력받아서 select_func 함수의 src 매개변수로 받는다.

 

select_func 함수
one 함수
two 함수
print_flag 함수

 

strncpy는 딱 31 바이트만 srcdest로 복사한다. (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

 

728x90
반응형

'SYSTEM HACKING > CTF, etc' 카테고리의 다른 글

[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

관련글 더보기