前言
前段时间打了国赛,出了道bulid的pwn题,用到了几个杂而有趣的知识点,玩起来不太通例,做起来甚至可以说是有点难受,在此纪录一下。
问题链接
文末也有链接
出题思绪
最近学了学安卓,想到了一个之前剖析过的mobile案例,一个apk通过挪用lua实现函数的重写(就是之前血洗高校的一个apk),觉得很好玩,决议应用到问题里边。
,,欢迎进入欧博官网(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。
文件结构:一个二进制文件,一个加密过的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);
登录并阅读全文
网友评论
欧博ALLBET网址
回复Allbet开户
get到好看的点了