bugku-pwn
bugku
read_note
照例
但是。。直接运行
我人傻了,交了就是
正规解法:Bugkupwn3
pwn4
wp参考:bugku pwn4 canary)
照例
IDA
跟进buf
char buf; // [rsp+10h] [rbp-240h]
0x240-0x8=0x238 换算成十进制为568
所以第一个覆盖点用“a*568”或者0x238
跟进v5
char v5; // [rsp+40h] [rbp-210h]
0x210-0x8=0x208 换算成十进制为520
所以第二个覆盖点用“a*520”或者0x208
记录下system地址0x400660
找canary
关注以下两条语句:
.text:000000000040082C mov rax, fs:28h
.text:0000000000400835 mov [rbp+var_8], rax
canary存在rbp+var_8,可以在0x40082C下断点进行gdb动调
单步跟发现
可以观察,随后会把rax的值放在rbp-8的位置,同时也证明我们找canary位置是对的,即rbp-8的位置
所以现在的思路是首先依据第一次回显泄露canary的值,第二次通过利用泄露的canary值实现栈溢出。
64位程序优先通过寄存器rdi传参,所以先找rdi,利用ROPgadget
1 | ROPgadget --binary pwn4 --only "pop|rdi|ret" |
可以找到如下结果
发现rdi,记录地址0x400963
但是少个/bin/sh,不过ROPgadget有读取字符串地址的功能
1 | ROPgadget --binary pwn4 --string '/bin/sh' |
记录下地址0x601068
exp就有了
1 | from pwn import * |
pwn5
照例
直接IDA
简单的栈溢出
0x20+8
64位文件下找rdi地址,用ROPgadget
1 | ROPgadget --binary pwn5 --only "pop|ret" | grep rdi |
IDA找到system地址和/bin/sh地址
exp就有了
1 | from pwn import * |
pwn7
wp参考:[pwn07 - Bugku CTF](