HackCTF의 Pwnable 첫 번째 문제 Basic_BOF #1 문제를 풀어보겠다.
우선 binary가 주어져 있으므로 IDA로 까 보도록 하겠다.
main을 디컴파일한 결과를 보기 위해 F5번을 누르면 이런 창이 뜬다.
코드를 보면, 정체불명의 v5값이 주어져 있고 비교를 하여 쉘을 딸 수 있는 기회를 제공한다.
if문에 있는 규칙도 안보이는 저 세 숫자는 뭘 뜻하는 걸까?
IDA에서는 숫자를 char나 hex, 8진수 체계로 변환할 수 있다. 저 숫자를 클릭하고 'H'키를 누르면...!
뭔가 의도적으로 넣은 듯한 글자가 보이기 시작한다!!
결론은, 우리는 Stack Buffer Overflow를 일으켜 v5의 값을 변화시켜야 한다.
실행하고 난 후 stack을 까 보도록 하자.
그런데, 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 |