wp合集(pwn)
##First 《p1》
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
void cmd()
{
system("sh");
}
void A()
{
char a[100];
scanf("%s",a);
return;
}
int main(){
A();
}
题:如上代码,利用缓存区溢出漏洞运行shell。
1.用命令行打开桌面当前目录(cd Desktop),然后用gdb打开程序可执行文件(gdb p1),start开始调试
2.观察代码发现要让a字符串输入溢出,并用cmd的地址替换A()函数中返回地址,首先使用objdump p1 -d反汇编程序,找到cmd()的地址。

cmd()地址:0804846b
3.然后需要知道被替换的地址,回到调试区域,利用si进入函数和ni执行下一步运行至输入语句:
4.用pattc 200给出长为200的有规律字符串:
将生成的字符串输入进程序
5.继续跑程序至出错,记录下出错的地址,就是我们要找的被替换地址。
6.记下地址,使用patto命令算出偏移量为112。
7.然后用命令行打开python,利用python pwntools操作,将填充的字符与替换的地址一起传送入程序命令行:
此处注意:因为内部储存是按小端序规则,被替换地址顺序因倒置,详情请看博客中小端序相关内容。最后输入id能查看相关内容,已经调用cmd()函数。
##Second
题:如下代码,利用缓存区溢出漏洞运行shell。
阅读后发现目标是让atoi(buf) == magic即可。做法与上题类似。
1.用命令行打开桌面当前目录(cd Desktop),然后用gdb打开程序可执行文件(gdb 3-13),start开始调试,运行至输入位置:
2.因为buf字符串只有100的空间,我们要让他溢出,并且溢出部分与atoi(buf)相同。所以,我们可以输入104个“0”。继续利用python pwntools
3.如图,显示Okey已经完成!
4.小探究:因为为什么就一定是104个字符呢?atoi(buf)是有四个,所以magic需要有四个?还是多余的字符与前面对应个数字符相比呢?做个小探究
1).将payload改为“\x00”104+”\x01”
虽然有报错,但显示成功了。说明最后多一个1没有影响,那么至于前四个相关。
2).将payload改为“\x00”103(出了点问题,有待改进)
##Third
ret-slide(p1为例)
1.还是利用命令行打开桌面,在桌面下打开p1,与第一题不同的是,现在运行,知道发现一个ret的地址,如下图:
ret地址为0x80484a0
2.然后用python pwntools,将payload=“\xa0\x84\x04\x08”*111(尽可能大)+”\x6b\x84\x04\x08”(第一题中获得的cmd地址)。这个过程要注意小端序。
如图,便已成功,return滑行。