[buuctf.reverse] 079_[安洵杯 2019]game

llvm的题,就是用一系列数字表示一个执行顺序,把代码一行行插到里边。安上不angr,因为这个题代码少,可以手工分析。

主程序就俩分支,顺序一看就明白,先给个数独应该是输入填的空;然后check

int __cdecl main(int argc, const char **argv, const char **envp)
{
  int v3; // eax
  __int64 v4; // rsi
  int i; // [rsp+2Ch] [rbp-54h]
  unsigned int v7; // [rsp+38h] [rbp-48h]
  char v8[56]; // [rsp+40h] [rbp-40h] BYREF
  int v9; // [rsp+78h] [rbp-8h]
  int v10; // [rsp+7Ch] [rbp-4h]

  v9 = 0;
  printf("input your flag:");
  gets(v8, argv);
  v10 = general_inspection((int (*)[9])sudoku);
  for ( i = 2490451983; ; i = -303742386 )
  {
    while ( 1 )
    {
      while ( i == -2071121728 )
      {
        v7 = blank_num((int (*)[9])sudoku);
        v4 = mem_alloc(v7);
        trace(sudoku, v4, v7);
        check((int (*)[9])sudoku);              // 空
        check1(v8);                             // 3步处理
        check3(v8);                             // 数据核对
        v9 = 0;
        i = -303742386;
      }
      if ( i != -1804515313 )
        break;
      v3 = -2071121728;
      if ( v10 )
        v3 = 664169471;
      i = v3;
    }
    if ( i == -303742386 )
      break;
    printf("error");
    check((int (*)[9])sudoku);
    v9 = 0;
  }
  return v9;
}

第1个check啥也没作(略)

第2个进行3步处理第1步将奇偶位交换,第2步将前一半与后一半交换,第3步就是第3,4位取反再减20,这个可以简化为^0xc -20

a1[v12] = (a1[v12] & 0xF3 | ~a1[v12] & 0xC) - 20;// ^0xc -20

数独这块手工解,不过是多解。用8在前的(程序试数一般从小试)

data = open('attachment', 'rb').read()[0x4060: 0x4060+81*4]
for i in range(9):
    for j in range(9):
	    print(data[4*(i*9+j)], end='')
    print('')
'''
105327008
809050020
070010503
490100300
010070906
703290480
060540809
004001030
021030704
'''
#4693641762894685722843556137219876255986
#4693641762984685722843556137219876255896
s = b'4693641762894685722843556137219876255986'
#3 v^0xc -20
s = [(i+20)^0xc for i in s]
#2 right+left
s = s[20:]+s[:20]
#1 odd+even
for i in range(0,40,2):
    s[i],s[i+1] = s[i+1],s[i]

print(bytes(s))
#flag{KDEEIFGKIJ@AFGEJAEF@FDKADFGIJFA@FDE@JG@J}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值