워게임/247CTF

[247CTF] HIDDEN FLAG FUNCTION - 포너블 / 버퍼오버플로우 / IDA / Pwndbg / Pwntool

SecurityMan 2023. 10. 4. 11:00

 

247CTF 에서 제공하는

 

간단한 버퍼오버플로우 문제

 

반응형

 

 

문제에서는 hidden_flag_function 바이너리 파일과

 

원격 접속 주소가 제공된다.

 

 

IDA 를 이용해 해당 바이너리를 열어봤을 때

 

flag, chall, main 세 함수가 정의되어 있었다.

 

 

main 함수에서는

 

chall 함수를 호출하고 있고

 

 

chall 에서는 scanf로 사용자의 입력을 받는다.

 

v1 의 크기가 68인데 입력값 범위를 체크하지 않아

 

버퍼오버플로우가 가능해 보인다.

 

 

마지막 flag 함수는

 

서버 내부의 flag.txt 파일을 불러와 내용을 출력해주는데

 

어디서도 호출하고 있지 않아 실행되지 않는 함수이다.

 

버퍼오버플로우를 통해 리턴 주소를 변경시켜 flag 함수가 실행되도록 만들어야 한다.

 

 

pwndbg를 이용해 바이너리를 분석한다.

 

 

info func 명령을 통해

 

함수의 주소를 기억해 둔다.

 

 

b chall 로 chall 함수에 브레이크포인트를 걸고

 

r 로 실행시켜 준다.

 

 

브레이크 포인트가 걸리면

 

ni를 계속 입력해

 

scanf 로 사용자 입력을 받는 부분까지 넘어가준다.

 

입력을 받으면 aaaa 라고 입력해준다.

 

 

x/100wx $esp 로 스택을 살펴보면

 

아까 입력한 aaaa(0x61616161)이 스택에 들어가 있는것을 볼 수 있다.

 

 

지금은 chall 함수에 있으므로

 

return 이되면 main 으로 돌아가야 한다.

 

main 함수의 주소는 0x0804864a 인데

 

 

다시한번 스택에서 보면

 

aaaa 로부터 얼마 떨어지지 않은 부분에서 주소를 찾을 수 있다.

 

그럼 이제부터 할일은

 

0x0804864a 바로 앞까지는 aaaa 같은 아무 값으로 채워넣고,

 

0x0804864a는 flag 함수의 주소인 0x08048576 로 덮어쓰는 것이다.

 

from pwn import *

p = remote('원격주소', 원격포트)

p.sendline(b'a'*76 + p32(0x08048576))

p.interactive()

 

pwntool 을 이용해 이렇게 간단하게 작성할 수 있다.

 

a 를 76개 채워넣고, 그다음 flag 함수의 주소를 붙혀주면 된다.

 

 

코드를 실행시키면

 

플래그를 찾을 수 있다.

반응형