Try to be the expert.

Ainsetin's Hacking & PS & Math

Hacking/HackCTF

HackCTF Basic_BOF #1 Write-up

Ainsetin 2019. 12. 22. 21:16

HackCTF의 Pwnable 첫 번째 문제 Basic_BOF #1 문제를 풀어보겠다.

 

 

우선 binary가 주어져 있으므로 IDA로 까 보도록 하겠다.

 

main을 디컴파일한 결과를 보기 위해 F5번을 누르면 이런 창이 뜬다.

 

코드를 보면, 정체불명의 v5값이 주어져 있고 비교를 하여 쉘을 딸 수 있는 기회를 제공한다.

 

 

if문에 있는 규칙도 안보이는 저 세 숫자는 뭘 뜻하는 걸까?

 

IDA에서는 숫자를 char나 hex, 8진수 체계로 변환할 수 있다. 저 숫자를 클릭하고 'H'키를 누르면...!

 

 

뭔가 의도적으로 넣은 듯한 글자가 보이기 시작한다!!

 

결론은, 우리는 Stack Buffer Overflow를 일으켜 v5의 값을 변화시켜야 한다.

 

실행하고 난 후 stack을 까 보도록 하자.

 

※ 참고로 gdb에서 -q는 처음에 실행할 때 정신없이 출력되는 것을 방지하는 옵션이다.

그런데, gdb를 사용하면서 잘 실행이 되는지 확인하기 위해 r을 입력했는데....?

 

파일이 없다고 한다. 내가 서버를 구축할 때 64bit 기반으로 구축하니 32bit 파일은 실행이 안되었다.

 

Thanks to pororiri.xyz

 

그래서 입력하는 명령어가 존재하는데, 바로 "(sudo) apt-get install libc6-i386" 이다.

 

그렇게 하게 되면....!

 

이상 없이 실행이 잘 된다!

 

입력을 받고 난 후 buf의 상태를 알아보기 위해 disas main을 한 뒤 break 할 위치를 찾았다.

 

fgets를 호출하고 나서 그다음에 바로 break를 걸면 buf의 위치를 알 수 있을 것이다.

 

따라서 main+44에 break를 걸어야 한다.

 

0x61616161이 시작되는 곳이 바로 buf의 시작점이고, v5에 0x04030201이 이미 저장되어 있었기 때문에 2번째 부분에 v5의 값이 있다는 것을 짐작할 수 있다.

 

저 부분을 변조하면 FLAG를 딸 수 있을 것이다.

 

buf 시작점인 0xffffd534부터 40개의 dummy를 넣고 그 뒤에 리틀 엔디안 형식으로 0xDEADBEEF를 넣으면 될 것이다.

 

빅 엔디안 : 0xDEADBEEF -----> 리틀 엔디안 : \xef\xbe\xad\xde

 

자, 이제 exploit code를 작성해보자.

 

 

직접 리틀 엔디안으로 집어넣어도 되고, 다른 방법으로는

 

 

p32 함수를 활용하여 패킹 과정을 코드로 작성할 수 있다.

 

실행해보면,

 

system 함수가 호출되어 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 내 버퍼가 흘러넘친다!!! 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