BUUCTF-rip 尝试PWN入门
原创
: BUUCTF-rip 尝试PWN入门
BUUCTF-rip 尝试PWN入门
BUUCTF-rip
拿到的是一个什么呢,感觉是一个小系统?
但是也就是一个小程序嘛。
这个程序就是执行一个输入输出 的命令。但是这里面存在漏洞。
这个s是15byte的字符
在fun部分有一个/bin/sh
这个据说是一个系统级函数,为什么说是系统级函数呢,因为有一个system吧。
一般会是什么用都没有。
但是在使用这样的一个payload后,就可以利用,也不知道这个pwn 库是做了什么。感觉像是变魔术。要刚好把堆栈覆盖到这个系统函数的位置?是不是这个解释呢。
1 |
|
get函数最后必有一个retn 返回调用地址。堆栈平衡什么的。
0x40118A就是劫持的一个目标函数地址。
使得get 返回了0x40118A,而不是main 中调用get 后的地址。
retn相当于pop + 执行,故形成了返回地址劫持。
效果可能是
pop 堆栈 ebp,esp 这里记不清了,应该是这两个寄存器中的一个
0x40118A
等价为
pop 堆栈
call system(“/bin/sh”)
这个就是15+8的来历
15是s的长度
8是因为64位的系统
我们这边要造成溢出利用,就得要从变量那边写数据,溢出到返回地址,这需要输入的字符串的长度=变量大小+ebp
32位程序的ebp的大小是4,64位程序的ebp的大小是8,那么这一题就是23,输入其他的数字一律不灵
使用checksec命令查看文件的信息。发现是64位。64位就是8byte
基本函数解释
send(data): 发送数据
sendline(data) : 发送一行数据,相当于在末尾加\n
recv(numb=4096, timeout=default) : 给出接收字节数,timeout指定超时
recvuntil(delims, drop=False) : 接收到delims的pattern (以下可以看作until的特例)
recvline(keepends=True) : 接收到\n,keepends指定保留\n
recvall() : 接收到EOF
recvrepeat(timeout=default) : 接收到EOF或timeout
interactive() : 与shell交互
连接:本地process()、远程remote( , );对于remote函数可以接url并且指定端口
数据处理:主要是对整数进行打包:p32、p64是打包为二进制,u32、u64是解包为二进制
IO模块:这个比较容易跟zio搞混,记住zio是read、write,pwn是recv、send
作者:SueLyon 链接:https://www.jianshu.com/p/6e528b33e37a
来源:简书
【1】Canary:Canary保护机制的原理,是在一个函数入口处从fs段内获取一个随机值,一般存到EBP - 0x4(32位)或RBP - 0x8(64位)的位置。如果攻击者利用栈溢出修改到了这个值,导致该值与存入的值不一致,__stack_chk_fail函数将抛出异常并退出程序。Canary最高字节一般是\x00,防止由于其他漏洞产生的Canary泄露
【2】FORTIFY:FORTIFY_SOURCE机制对格式化字符串有两个限制(1)包含%n的格式化字符串不能位于程序内存中的可写地址。(2)当使用位置参数时,必须使用范围内的所有参数。所以如果要使用%7$x,你必须同时使用1,2,3,4,5和6。
【3】NX:NX enabled如果这个保护开启就是意味着栈中数据没有执行权限,以前的经常用的call esp或者jmp esp的方法就不能使用,但是可以利用rop这种方法绕过
【4】PIE:PIE enabled如果程序开启这个地址随机化选项就意味着程序每次运行的时候地址都会变化,而如果没有开PIE的话那么No PIE
(0x400000),括号内的数据就是程序的基地址
【5】RELRO:RELRO会有Partial RELRO和FULL RELRO,如果开启FULL RELRO,意味着我们无法修改got表
等我看明白再写的什么