Category - Rctf2019

比赛的时候没有解出这题,当时尝试遍历syscall num来看有没有系统调用可以泄露地址,想着可以bypass aslr,但是逻辑上来讲syscall作为程序与内核的接口,不应该泄露出程序运行的地址信息。当时候确认两个比较有用的系统调用`sys_brk`和`sys_rt_sigreturn`,前者可以得到一个heap地址,后者可以做srop来控制rip等寄存器。 看了wp之后才发现思考的方向错

密文

cs pu lt 90 fd 500 rt 90 pd fd 100 rt 90 repeat 18[fd 5 rt 10] lt 135 fd 50 lt 135 pu bk 100 pd setcolor pick [ red orange yellow green blue violet ] repeat 18[fd 5 rt 10] rt 90 fd 60 rt 90 bk 30 rt 90 fd 60 pu lt 90 fd 100 pd rt 90 fd 50 bk 50 setcolor pick [ red orange yellow green blue violet ] lt 90 fd 50 rt 90 fd 50 pu fd 50 pd fd 25 bk 50 fd 25 rt 90 fd 50 pu setcolor pick [ red orange yellow green blue violet ] fd 100 rt 90 fd 30 rt 45 pd fd 50 bk 50 rt 90 fd 50 bk 100 fd 50 rt 45 pu fd 50 lt 90 pd fd 50 bk 50 rt 90 setcolor pick [ red orange yellow green blue violet ] fd 50 pu lt 90 fd 100 pd fd 50 rt 90 fd 25 bk 25 lt 90 bk 25 rt 90 fd 25 setcolor pick [ red orange yellow green blue violet ] pu fd 25 lt 90 bk 30 pd rt 90 fd 25 pu fd 25 lt 90 pd fd 50 bk 25 rt 90 fd 25 lt 90 fd 25 bk 50 pu bk 100 lt 90 setcolor pick [ red orange yellow green blue violet ] fd 100 pd rt 90 arc 360 20 pu rt 90 fd 50 pd arc 360 15 pu fd 15 setcolor pick [ red orange yellow green blue violet ] lt

就像最后的flag提示的,就是一个在thread中的house of orange利用。 漏洞在填充chunk的时候可以进行溢出。 ![](https://leanote.com/api/file/getImage?fileId=5ce3b917ab6441049600255f) 原版house of orange的做法是改小top chunk的size来生成一个位于unsortedbin中的c
程序逻辑比较简单,首先读取7byte的shellcode然后执行。经过mf同学的指点构造出以下shellcode来读取更长的shellcode。 ```python payload = asm("xchg rdi,rsi\n pop dx\n syscall") ``` 然后发现使用get shell的shellcode本地可以打但是远程不行,尝试反弹shellcode发现可以反向连接远程机器


分析程序

/calculate 逻辑

/calculate的代码在frontend/src/app.controller.ts,它的逻辑是:

  1. 将用户的POST数据转化为CalculateModel对象,并检查数据是否有效,数据无效的话返回400状态码;
  2. bson序列化CalculateModel对象,把序列化的数据发送给三个后端:node.js、php、python;
  3. 获取到三个后端返回的数据再判断三个数据的json序列化是否相同,不相同的话返回That's classified information. - Asahina Mikuru
  4. 随机返回一个数据。

CalculateModel

  1. export default class CalculateModel {
  2. @IsNotEmpty()
  3. @ExpressionValidator(15, {
  4. message: 'Invalid input',
  5. })
  6. public readonly expression: string;
  7. @IsBoolean()
  8. public readonly isVip: boolean = false;
  9. }

ExpressionValidator:

  1. export function ExpressionValidator(property: number, validationOptions?: ValidationOptions) {
  2. return (object: Object, propertyName: string) => {
  3. registerDecorator({
  4. name: 'ExpressionValidator',
  5. target: object.constructor,
  6. propertyName,
  7. constraints: [property],
  8. options: validationOptions,
  9. validator: {
> 因为开了seccomp, 这题的利用方法变得非常绕。 ![bug](https://leanote.com/api/file/getImage?fileId=5ce21521ab644149370053cc) 漏洞在edit函数处,添加内容后有一个明显的off-by-one null byte漏洞。 虽叫babyheap,但自然是保护全开的。 ```plain Arch:
### 分析流程 1. 生成8个种子固定的"随机数”,并处理(后面分析可知是blowfish的初始化) 2. 输入flag,并进行hex转换。 3. 用blowfish进行解密。 4. 初始化一个迷宫(初始位置为11行6列) 5. 使用解密后的结果作为迷宫的输入 6. 如果走到结束则正确(结束位置为5行10列,只能走16步) ### 解答方法 用peid查一下,可知有blowfish的特
### 分析程序 1. 输入account,长度为7-16 2. 输入password,长度为7-16,每个字符为10-99 3. 将account作为key,对一个定值执行转换操作(操作几乎和上一题一样) 4. 输入data,长度为0-1024,只允许输入[0-9a-fA-F] 5. 对password进行转换操作,数据为data(其中要求date的长度为一个较大的值) 6. 将步骤3的结
### 分析程序 1. 读入flag([0-9a-f]),并转换为hex. 2. 经过一个转换操作,输入8字节,输出6字节 3. 转换操作中有一个加密函数,这个函数中有tea加密的特征值,且这个函数的第二个参数可以控制加密或解密,且输入8字节,输出8字节。 4. 分析程序可知,加密操作后,要求最后一字节为02。 5. 转换操作输出的结果为,加密操作后的前6字节。 6. 转换后的值进行crc


在476包里找到一个控制信号:

476

  1. 2MFG:4BARCODE;CMD:TSPL2;MDL:3B-363B;CLS:PRINTER;

打印机用的是TSPL2语言。
674、675包是输入的程序:

674

  1. SIZE 47.5 mm, 80.1 mm
  2. GAP 3 mm, 0 mm
  3. DIRECTION 0,0
  4. REFERENCE 0,0
  5. OFFSET 0 mm
  6. SET PEEL OFF
  7. SET CUTTER OFF
  8. SET PARTIAL_CUTTER OFF

675

  1. SET TEAR ON
  2. CLS
  3. BITMAP 138,75,26,48,1,……
  4. BITMAP 130,579,29,32,1,……
  5. BAR 348, 439, 2, 96
  6. BAR 292, 535, 56, 2
  7. ……
  8. BAR 152, 351, 16, 2
  9. BAR 152, 351, 2, 16
  10. PRINT 1,1

查文档分析程序:
https://www.mediaform.de/fileadmin/support/handbuecher/Armilla/Handbuecher/TSC_TSPL_TSPL2_Programming.pdf
下面是重要的命令:

SIZE

纸张的大小,1mm等于8像素或12像素,经测试是8像素。

BITMAP

将BMP图像打印出来,前四个参数分别是打印位置X、Y和图像长宽,第五个参数是模式,不需要管,第六个参数是图像数据,注意是二值,长是字节数,宽是像素数。

BAR

画长方形,前四个参数也是打印位置X、Y和长宽。

接下来用PIL模拟打印过程,最后要旋转180°:

solve.py

  1. from PIL import Image, ImageDraw
  2. W_mm, H_mm = 47.5, 80.1
  3. W, H = int(W_mm * 8), int(H_mm * 8)
  4. img = Image.new('1', (W, H), 1)
  5. fp = open('675.bin', 'rb')
  6. print(fp.readline().strip()) # SET TEAR ON
  7. print(fp.readline().strip()