Try to be the expert.

Ainsetin's Hacking & PS & Math

Hacking/HackCTF

HackCTF x64 Simple_size_BOF Write-up

Ainsetin 2019. 12. 23. 14:33

x64 기반의 두번째 문제이다.

 

이번에는 버퍼의 크기가 작거나 매우 크게 주는가보다. 뭐 그래도 풀리긴 할거니까... 도전!

 

우선 checksec부터 해보자.

 

깔ㅡ끔 그자체이다.

 

이번엔 IDA로 바이너리를 까보겠다.

 

간단하다. s 출력 후 buf의 주소를 알려준 뒤, gets로 그곳에 어떤 값을 넣나보다.

 

그런데, 문제가 있다. system 함수를 불러오기 위한 함수가 존재하지 않는다.

 

하지만 걱정하지 마라, (손은 눈보다 빠르니까)

 

버퍼의 크기가 워낙 크므로 64bit를 기반으로 한 쉘코드를 buffer에 집어넣는 것이 좋을듯 하다.

 

우선 31byte 크기의 64bit 쉘코드를 찾았다.

 

"\x48\x31\xff\x48\x31\xf6\x48\x31\xd2\x48\x31\xc0\x50\x48\xbb\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x53\x48\x89\xe7\xb0\x3b\x0f\x05"

 

이걸 사용하면 될 듯 하다.

 

payload 구성은 "shellcode(31byte)+dummy(27952-31+8(SFP)=27929byte)+v4 주소(8byte)"이다.

 

그런데 직접 nc 서버를 돌리니....

 

실행할 때마다 주소가 달라지는 것을 알 수 있었다!! 따라서 이 문제는 ASLR도 걸려 있었다...

 

따라서 저 주소를 leak 해야된다는 것인데... 다행히도 pwntools은 만능이기 때문에 leak를 할 수 있었다.

 

p.recvline() 또는 p.recvuntil()로 필요 없는 문자열을 모두 받은 뒤, buf_addr = int(p.recv(16)[0:],16)으로 받으면 된다.

 

--> 0x7ffff ______가 16자리라서 16자리만큼 문자열로 받고 int를 사용하여 16진수로 받는 것이다.

 

전체적인 payload는 다음과 같다.

 

 

실행시켜보면....!

 

 

flag를 획득할 수 있다.

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

HackCTF offset Write-up  (0) 2019.12.29
HackCTF Simple_Overflow_ver_2 Write-up  (0) 2019.12.23
HackCTF x64 Buffer Overflow Write-up  (0) 2019.12.23
HackCTF 내 버퍼가 흘러넘친다!!! Write-up  (0) 2019.12.23
HackCTF Basic_FSB Write-up  (0) 2019.12.22