Try to be the expert.

Ainsetin's Hacking & PS & Math

Hacking/HackCTF

HackCTF 내 버퍼가 흘러넘친다!!! Write-up

Ainsetin 2019. 12. 23. 09:10

오늘은 Pwnable 3번째 문제, "내 버퍼가 흘러넘친다!!!"를 풀어보겠다.

 

우선 바이너리를 체크하니 아무것도 걸려 있지 않았다. 따라서 쉘코드를 충분히 사용할 수 있고, RET 변조가 가능하다.

 

 

read 함수와 gets 함수가 있는데, 함수의 에필로그까지 간 다음 RET가 존재하므로 gets에서 BOF를 일으키면 된다.

 

그런데 s의 크기가 20byte밖에 되지 않아 쉘코드를 저장할 수 없다.

 

따라서 버퍼에 더미값을 넣고 쉘코드를 버퍼 밖에 저장한 뒤, RET를 변조하여 쉘코드 주소를 가리키게 하면 flag를 획득할 수 있을 것이다.

 

우선 gdb로 stack을 활용하기 위한 준비 과정을 거쳐보자.

 

gets 다음 main+78에 break를 걸면 될 것이다.

 

0x41부분은 buffer이고, 0x42부분은 SFP, 0x43부분은 RET, 0x44부분은 그 이외 바깥 부분이다. 우리는 0x44 부분에 쉘코드를 집어넣으면 될 것이다.

 

RET인 0x43434343부분에 적당히 0xffffd594(nop sled 부분)을 넣어주겠다.

 

최종적인 BOF 과정은 "dummy(24byte) + 0xffffd594 p32 패킹(4byte) + shellcode(25byte)"이다.

 

 

그런데.....,,

 

쉘이 따이지 않았다.. 왤까? 하고 생각하는 도중에 ls를 치니 BOF 현상에 따른 코어 파일이 생성되어 한번 확인해보았다.

 

gdb로 보는 것과는 조금 다른가보다... 아무튼 x/20wx $esp-100을 치니 전체 exploit code는 잘 들어간 것을 확인할 수 있었는데...?

 

shellcode의 주소가 다른 것을 확인할 수 있었다!! 그래서 0xffffd630으로 주소를 바꾸고 실행해보았다.

 

쉘이 따이는 모습을 볼 수 있었다. 그런데 로컬에서만 쉘이 따여서 의미가 없었다. 왜 그럴까?

 

nc 서버의 3003번 포트는 ASLR이 걸려 있는 것이 틀림없었다. 그래서 BSS 영역에 있는 name 변수를 활용하는 방법을 사용하였다. (BSS 영역은 ASLR이 걸려도 주소가 바뀌지 않기 때문이다)

 

name 변수의 주소는 IDA에서 확인 해보니 0x804a060이었다. 이곳에 쉘코드를 넣고 RET에 이 주소를 넣는 방식이다.

 

exploit code는 다음과 같다.

 

 

실행시켜보면....!

 

 

flag를 획득할 수 있다!!

'Hacking > HackCTF' 카테고리의 다른 글

HackCTF x64 Simple_size_BOF Write-up  (0) 2019.12.23
HackCTF x64 Buffer Overflow Write-up  (0) 2019.12.23
HackCTF Basic_FSB Write-up  (0) 2019.12.22
HackCTF Basic_BOF #2 Write-up  (0) 2019.12.22
HackCTF Basic_BOF #1 Write-up  (2) 2019.12.22