jarvis oj pwn level1

题目链接:https://dn.jarvisoj.com/challengefiles/level1.80eacdcd51aca92af7749d96efad7fb5

nc pwn2.jarvisoj.com 9877

检查一下保护措施(输入命令):checksec 文件名

jarvis oj pwn level1jarvis oj pwn level1

题目是32位的,没有任何保护措施

运行一下试试

jarvis oj pwn level1

很简单,提示输入,然后输出hello world,值得注意的地方是后面的类似地址的东西

拿到ida看看伪c代码

main函数,很简单,就是调用vulnerable_function()函数,然后输出hello world

jarvis oj pwn level1

再看看vulnerable_function()函数,%p就是输出buf的首地址,read输入,明显栈溢出,buf大小是0x88,而给可以输入0x100

jarvis oj pwn level1

通过搜索发现,题目里面并没有给出system(/bin/sh),这就需要我们自己写shellcode(shellcode就是一段代码,用于用户攻击远程服务器,可以获取权限拿到/bin/sh),pwntools提供了获取/bin/sh   shellcode,就是shellcraft.sh(),不过,现在shellcode还是汇编代码,不是能用的机器码,所以还需要进行一次汇编,用asm(shellcraft.sh())即可这就完成了获取/bin/sh的shellcode,不过shellcode这个非常重要,一定要学会自己编写。

说下思路,首先肯定是利用buf的溢出来执行shellcode,上面已经说到,题目给我们buf的首地址,那么我们可以这样 

jarvis oj pwn level1

将shellcode放到buf首地址,溢出后将返回地址改为buf首地址执行shellcode,有了思路接下来写exp

jarvis oj pwn level1

前面我们说到程序运行时会提示buf首地址,第7行代码意思是接收输出字符,然后截取出地址,所以payload就是shellcode加上栈中间大小的垃圾字符,因为里面要放shellcode,所以减去shellcode的长度,加上buf首地址

运行,cat flag,获取flag

jarvis oj pwn level1

后面在写一点吧,写博客真的比较重要,不仅仅是复习知识,更重要的是督促自己学习。