1、x64
1、程序
拿到题目
链接:http://pan.baidu.com/s/1pKTjqgr 密码:dhw5checksec pwn2
程序可以知道是64位的,它的传参优先由寄存器完成。
接着,我们应该了解程序的流程,以及找到程序的漏洞,以及思考其利用方式。
2、分析程序
我们去尝试运行,摸清了基本上的程序的功能。
功能1,可以获得libc的基址
功能2,可以获得函数的地址
功能3,输入的地方,感觉这个地方可能存在漏洞。
紧接着,我们可以用IDA 分析程序了。
发现一个函数的不适当应用,拷贝的过程中没有判断大小,可能造成缓冲区溢出。
void memcpy(voiddest, const void * src, size_t n);
由src指向地址为起始地址的连续n个字节的数据复制到以destin指向地址为起始地址的空间内。savedregs是一个IDA关键字我们可以看到 保存的堆栈帧指针和函数返回地址:在IDA中,我们可以直接单击它。
buf的大小应该是8没错,之后可能造成缓冲区溢出,那么我的解题思路大概是如下:
1、找到system的地址
2、找到”/bin/sh”地址,找不到就找个bss地址,将”/bin/sh”传入
3、找个gadgets像pop rdi,ret
完成上面三个步骤,我们就可以去构造我们的ROP链来getshell。
3、找
这个ROPgadget安装参考:
https://github.com/JonathanSalwan/ROPgadget
找到本地的gadgetsROPgadget --binary /lib/x86_64-linux-gnu/libc.so.6 --only "pop|ret"|grep rdi
参看目标libc版本:ldd
找到本地的/bin/shstrings -a -tx /lib/x86_64-linux-gnu/libc.so.6 | grep "/bin/sh"
可以知道”/bin/sh”偏移是0x161999
至于sytem函数,程序的第二个功能已经给我们了,至此,我们可以开始构造我们的exp了.
4、exp:
|
|
这里记录一下我走过的坑,
不知道libc.so.6的地址打印出来是干什么的,开始我认为是libc_base,但是它的值比打印出来的system值大,这就很奇怪,因为:
system_offset = so.symbols[‘system’]
systemAddr - system_offset = libc_base
writeAddr -so.symbols[‘write’] = libc_base
所以不知道它的作用是什么,但这道题,没有给libc.so.6,据说是可以查看版本的,这里我就偷懒的,因为和上一道题是在同一台机器上的,那肯定用同一个libc库了,直接拿来用
2、入群
链接:http://pan.baidu.com/s/1qY4wyoW 密码:46d4
代码
之后是什么、、、、说好的flag呢?
哇还有东西,居然还有都行,居然是.dat文件
害怕-恐怖
才想到做题技术大牛说的,不要害怕新的挑战,敢于尝试,
然后,研究几分钟,发现就很简单算法
这时想去昨天技术大牛说的话,可能并不难,只是有颗害怕的心
Do_more_and_ask_less