8月9日pwn学习

ldd

要看一个一个程序依赖的so文件可以用ldd命令,ldd命令后面必须跟上这个程序的绝对命令,一般先用which找到这个程序的绝对路径

然后再用ldd命令查看。

ldd结果分为三列

第一列:程序依赖库的名字

第二列:系统提供库的名字

第三列:库加载的开始地址

而在pwn中可以多次用ldd命令查看,来判断该程序是否提供了ASLR保护

 

如图所示

gdb插件peda

在安装插件之前是需要安装gdb的,gdb的安装教程,没有找到国内的源镜像地址,所以很慢

这是一个调试时必不可少的神器,先从github复制到自己的码云仓库再下载。

1.git clone https://gitee.com/sanmuforrest/peda.git ~/peda

2.echo "source ~/peda/peda.py">>~/.gdbinit

题目:int_overflow

题目描述:菜鸡感觉这题无法溢出,真的么?

题目分析:

1.checksec

2.file查看文件

3.ida分析文件

首先查看程序各层级内容

 

 

 

 

 

在搜寻的时候我们发现了这个函数what is this(),发现其中包含flag

 

 

 

 

 

这里写两个c语言库函数

read():ssize_t read(int fd,void*buf,size_t count)fd为文件描述符,通常为0,每次读出count字节数到缓冲区buf中

write():ssize_t write(int fd,void*buf,size_t count)fad为文件描述符,通常为1,每次写入count字节,需要写入的数据为buf。

strcpy():char *strcpy(char *dest, const char *src) 把src指向的字符串复制到dest中。

可现在的问题是如何调出这个函数,整个函数看起来好像都没有一个合适的注入点。在查看了函数的各层级函数后,发现只有login()里的check_passwd()中的strcpy函数适合作为溢出点,这里将输入的密码s复制到dest中,而s的长度为0x200,dest还有0x14到栈底,满足溢出条件。也就是说为了满足栈溢出(上个随笔),输入的密码s的长度至少为0x14,加上要覆盖栈底的要调用另一个函数的ebp指针0x04,再加上我们需要的函数地址0x04作为返回地址。但这个时候长度是超出if条件距离要求的长度在0x3和0x8之间,但是我们再看在定义passwr_length的时候

 

 

用的是_int8类型的变量,而这个变量最多存储256大小的数字,如果这个数字为257,那么其大小就变为1,称为整数溢出。也就是说我们输入passwd的长度在区间256+4~256+8为好,那么这个时候我们的passwd还需要260-(0x18+0x04)——264-(0x18+0x04)长度。

利用上面这些,就可以写我们的payload了,我们取还需要260-(0x18+0x04)长度的passwd。payload=‘a’*(0x14+0x04)+p32(hanshuadd)+'a'*(256+0x4-0x18-0x04)

4.写exp

5.得到结果

 

posted @ 2020-08-10 00:18  三木森林  阅读(171)  评论(0编辑  收藏  举报