Open Table of contents
之前说啥来着?想嗨几天?害,我看我是停不下来了 ^-^ 听着,陌生人,你还年轻,千万别学我,天天厮混在这该死的二进制的海洋里面。带上朋友们一起加入吧 bushi
嗯,这章是之前 Memory Errors 和 Shellcode Injection 的组合,需要我们充分利用之前所学的一切知识来组织攻击链。
感觉应该挺简单。我,CuB3y0nd,请求出征!
Write a full exploit involving shellcode and a method of tricking the challenge into executing it.
所以,我一眼就看出了你的所有漏洞,并用不到 10 秒想出了一套完整的针对你的攻击链。你,不愧是一道纯正的开胃菜。
~握草了好下笔啊啊啊啊。~下面讲正经的,shellcode 方面没遇到什么限制,程序在 0x2247D000
专门为我们的 shellcode 分配了 0x1000
字节的 rwx
空间,我们随心日它就完了。随后,有一个任意大小读,用它溢出 buf
并覆盖返回地址为 0x2247D000
即可。easy peasy!
Flag: pwn.college{YRuLYIKU6u9uASqOycoKQO17Ttn.0VOxMDL5cTNxgzW}
Write a full exploit involving shellcode and a method of tricking the challenge into executing it.
以后像这种子 level,如非必要,我都不会再贴 wp 了,因为和 main level 没太大区别,无非就是删除了多余的提示信息,strip 了符号表和调试信息。
Flag: pwn.college{8kWI1BeY-FwKn2lIHdlSEEYHZ_G.0FMyMDL5cTNxgzW}
Write a full exploit involving injecting shellcode and a method of tricking the challenge into executing it. Note, ASLR is disabled!
很明显的栈溢出,没开 ASLR,而栈又有 rwx
权限。那我们把 shellcode 注入到 buf
头,再覆盖返回地址为 buf
头的地址就好了。
Flag: pwn.college{8534tOGLdefUghR4lz5RbC5wYk5.0VMyMDL5cTNxgzW}
Write a full exploit involving injecting shellcode and a method of tricking the challenge into executing it. Note, ASLR is disabled!
这题没回显,所以问题就是返回地址是什么了。因为没开 ASLR,每次栈的基地址都是相同的,所以这里我直接采用爆破的方式了。
Flag: pwn.college{IF2KSArBx1ONOOxBvejSZ5gUqc0.0lMyMDL5cTNxgzW}
Write a full exploit involving injecting shellcode and a method of tricking the challenge into executing it by utilizing clever payload construction.
具体怎么打这题的话,我觉得光靠之前的 Memory Errors 和 Shellcode Injection 这两章学到的知识应该还不够打通这题。主要问题出在如何返回到我们的 shellcode。这题本身是有 ASLR 的,每次栈地址都不一样。程序唯一的一个 RWX 段又是我们的栈段,所以……我们的 shellcode 只能放在栈上,那么怎么知道栈的地址呢?泄漏应该是泄漏不出来的,没有格式化字符串漏洞。Nop Sled 感觉也不太行?我没试过,但是脑子里面简单过了一遍感觉不太可能吧。唯有构造 ROP Chain 我觉得是可以的,不过如果真构建 ROP Chain 了那我还要什么 shellcode 啊哈哈哈。所以有很大可能就是这题想考的技巧我没想到(也不排除就是需要用 ROP Chain 也说不准) ,反正这里就先只贴个反编译结果了,要是哪位师傅有想法的话欢迎在底下评论。我先去打 ROP 了,打完之后再回头继续打这章~
反正别告诉我你要通过程序的回显来打……应该没这样的人吧……你要真通过回显打通了,那 3.1 你怎么办是吧哈哈哈。总之看回显很没意思,丧失了本来的意义。
过了十分钟……
好的知道了,果然是我没想到……其实 rbp 也可以被泄漏出来不是吗,用它减去输入起始地址,我们发现偏移是一样的,那构造 shellcode 的时候我们就用泄漏出来的 rbp 减去得到的偏移地址,这就是返回地址了。然后,boom!
boom 个鸟,忘记触发后门后再次调用 challenge 会创建新的栈帧了。不过这两个栈帧一定是紧挨着的,所以我们的思路还是这样,这没问题。只不过计算的时候注意是用第一个栈帧的 rbp 减去第二个栈帧的输入起始地址罢了。(我就说我这么完美的 payload 怎么可能会打不通,果然是忘了什么……Alr, boom!)
Flag: pwn.college{IDpfJ24swVO_Q0TAY9ajONzKHTe.01MyMDL5cTNxgzW}
Write a full exploit involving injecting shellcode and a method of tricking the challenge into executing it by utilizing clever payload construction.
参见 Level 3.0。
Flag: pwn.college{w1Gz9LGRK9kmwUD7TZnA3xcKN5j.0FNyMDL5cTNxgzW}
Write a full exploit involving injecting shellcode, reverse engineering, and a method of tricking the challenge into executing your payload.
很简单吧,令 v14 == 0x49954B5EFDCB2A29
才可以返回到我们的 shellcode。
Flag: pwn.college{ECpb0UATZ-UymShuFolh7qzxgrx.0VNyMDL5cTNxgzW}
Write a full exploit involving injecting shellcode, reverse engineering, and a method of tricking the challenge into executing your payload.
参见 Level 4.0。
Flag: pwn.college{UiJc7-6JI988NELrbF-uNpbwc-X.0lNyMDL5cTNxgzW}
Write a full exploit involving injecting shellcode, reverse engineering, seccomp, and a method of tricking the challenge into executing your payload.
我本以为是要 bypass seccomp 的题,没想到根本用不着动脑子……
令 v18[13] == 0x484D17DF2438CECF
seccomp 就形同虚设了。试问这题和前面两题有啥区别吗,是不是这题就是个引子,后面有真正的 seccomp 玩呀 LOL
值得注意的是这里我们泄漏出来的 rbp 并不是真正的 rbp,而是一些其它的栈内数据,它后面也有别的返回地址,不过都覆盖掉好像也没啥问题,目的达到了就好~
我只是想说,我懒得改变量名了,总之解释清楚别误解了就好哈哈哈。
Flag: pwn.college{k8hu05Nam_pIp8PRsZsT8XQmYSZ.01NyMDL5cTNxgzW}
Write a full exploit involving injecting shellcode, reverse engineering, seccomp, and a method of tricking the challenge into executing your payload.
参见 Level 5.0。
Flag: pwn.college{w8_cw1WNbjdmbd10XDPrPKfumT5.0FOyMDL5cTNxgzW}
Write a full exploit involving injecting shellcode, reverse engineering, seccomp, and a method of tricking the challenge into executing your payload.
得,果不出我所料,这 seccomp 不就来了嘛~
其实不用 seccomp-tools 也行,不过这里也贴一下好啦:
seccomp_rule_add
会允许 v16[i]
处保存的系统调用,v16[i]
处保存的两个默认系统调用分别是 write (1)
和 exit_group (231)
,究其原因是因为程序执行完 seccomp 后还需要调用 puts
函数,而 puts
函数就需要这两个系统调用才可以执行。
所以我们有两个可用的系统调用可以发挥(怎么发挥?栈溢出过去覆盖成自己的~),这里还是选择 chmod
,允许了 chmod
后还需要允许 write
才可以成功执行 chmod
,我猜应该是因为 chmod
会去修改 inode
中保存的权限信息,而修改它需要 write
系统调用,所以使用 chmod
的话我们必须同时允许 write
才行。
需要注意的就是必须先允许主要系统调用,再允许其内部依赖的系统调用,否则 seccomp 会直接阻止主要调用。
Flag: pwn.college{Uh7pFxiL1QPHZzDdWNmvsW7FH_Y.0VOyMDL5cTNxgzW}
Write a full exploit involving injecting shellcode, reverse engineering, seccomp, and a method of tricking the challenge into executing your payload.
参见 Level 6.0。