一道结合lua的pwn题--出题思路与解题过程
2021-01-13 17:30:53 Author: xz.aliyun.com(查看原文) 阅读量:270 收藏

前言

前段时间打了国赛,出了道bulid的pwn题,用到了几个杂而有趣的知识点,玩起来不太常规,做起来甚至可以说是有点难受,在此记录一下。

题目链接

文末也有链接

出题思路

最近学了学安卓,想到了一个之前分析过的mobile案例,一个apk通过调用lua实现函数的重写(就是之前血洗高校的一个apk),觉得很好玩,决定应用到题目里边。

文件结构:一个二进制文件,一个加密过的Lua文件,一个flag文件。

程序流程:

  • 二进制程序部署在特定端口,使用nc访问
  • 程序起来后会加载加密过的lua文件到内存,之后程序在内存中解密lua程序,在程序中输入字符,将字符交给lua进行处理,必须满足某种关系程序才能向下进行。
  • 完成绕过后选择了缓冲区溢出,文件没关canary,用ssp leak可以直接把flag读出来。整体看下来就是一个披着pwn题外衣的C加lua程序逆向题。
  • 因为用到了好多C语言lua库函数的好多函数,用ida分析程序会发现非常恶心,得仔细扣,之前没接触过这种的还得现学。

环境搭建

题目源码

写的时候现学现卖,请师傅们指教

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <unistd.h>
#include <lua5.1/lua.h>
#include <lua5.1/lualib.h>
#include <lua5.1/lauxlib.h>
char flag[0x20];
char* c;
uint8_t *enc(uint8_t *data, int size) {//加密函数,和解密函数完全一致
    uint8_t *temp = (uint8_t *)malloc(size);
    int k[3]={2,3,5};
    int i;
    if (size) {
        for (i = 0; i < size; i++) {
            temp[i] = data[i]^k[i%3];
        }
    return temp;
    }
}
int main()
{
    setvbuf(stdout,0,2,0);
    FILE *f = fopen("main.lua", "rb");//读入同目录加密过的lua文件
    if (f == NULL)
        return -1;
    fseek(f, 0, SEEK_END);
    long file_size = ftell(f);
    uint8_t *buf = (uint8_t *)malloc(file_size);
    rewind(f);

文章来源: http://xz.aliyun.com/t/9004
如有侵权请联系:admin#unsafe.sh