x2658y's Blog

杂七杂八的记事本

直接打开, 让输flag, 随便试一下

image-20220120234044392

首先D.I.E查壳

D.I.E查壳工具: Github

image-20220120232650513

可见是UPX壳, 就不上脱壳机了, 上x32dbg手工脱壳

image-20220120234405168

从入口往上翻能看到pushad, 一般UPX壳的的pushadpopad隔得不远, 往下翻就能找到,也可以使用堆栈平衡法(esp定律法)来找popad

image-20220120234745819
image-20220120235818368

跟到0x401280里, 看起来没问题, 尝试脱壳, 使用Scylla插件

image-20220121000101326

OEP设置为0x401280再IAT Autosearch, 再get import, 一切正常, dump出exe, 再fix dump刚导出的exe

image-20220121000248577
image-20220121000337291

尝试打开, 正常运行, 说明脱壳成功

image-20220121000655406

再用D.I.E查看, 已经无壳了

image-20220121000749537

拖进IDA分析, F5查看伪代码, 就是比较输入与字符串"HappyNewYear!", 所以flag应该就是flag{HappyNewYear!}image-20220121001208743

验证, flag正确

image-20220121001339364

惯例, 用dirsearch扫描一下, 扫到个index.php.bak

dirsearch项目地址: Github

image-20211106235918753

源代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
include_once "flag.php";

if(isset($_GET['key'])) {
$key = $_GET['key'];
if(!is_numeric($key)) {
exit("Just num!");
}
$key = intval($key);
$str = "123ffwsfwefwf24r2f32ir23jrw923rskfjwtsw54w3";
if($key == $str) {
echo $flag;
}
}
else {
echo "Try to find out source file!";
}
?>

审计代码, 当$key为数字且与$str弱相等的时候即可显示出flag

php弱类型比较:

1
2
3
4
5
6
7
8
字符串和数字比较使用==时,字符串会先转换为数字类型再比较
var_dump('a' == 0);//true,此时a字符串类型转化成数字,因为a字符串开头中没有找到数字,所以转换为0
var_dump('123a' == 123);//true,这里'123a'会被转换为123

var_dump('a123' == 123);//false,因为php中有这样一个规定:字符串的开始部分决定了它的值,如果该字符串以合法的数字开始,则使用该数字至和它连续的最后一个数字结束,否则其比较时整体值为0。
举例:
var_dump('123a1' == 123);//true
var_dump('1233a' == 123);//false
image-20211109164631082

嗯, 熟悉的味道.

image-20211106231659231

试试万能密码

image-20211106231624603

不行, 注意看图上的地方, 提交的参数中的or被删掉了, 应该是字符串替换之类的

经过尝试or, and, from, where, select等关键字都会被删除, 但是只会删除一次, 所以可以采用双写绕过.

image-20211106232220046

后续采用双写测出注入点, 在第2,3列, 后续接着采用双写绕过字符替换.

image-20211106232338835

具体操作与[极客大挑战 2019]LoveSQL 1大体相同.

0%