时间从来不语,却回答了很多问题


PWN环境搭建

  1. 新建Ubuntu虚拟机

  2. 安装python与pip(可以用python3)

  3. 安装 git,gdb 和 gdb-multiarch,同时安装 binfmt 用来识别文件类型

    1
    2
    sudo apt install git gdb gdb-multiarch
    sudo apt install "binfmt*"
  4. 安装 gdb 的插件 pwndbg(或者 gef 等 gdb plugin)

    1
    2
    3
    git clone https://github.com/pwndbg/pwndbg
    cd pwndbg
    ./setup.sh

    如果安装超时出错参考:Ubuntu安装pwndbg超时处理( Read timed out)

  5. 安装pwntools

    1
    pip install pwntools
  6. 如果要在64位linux下运行32位程序,需要装multilib(测试ubuntu22.04 wsl2不需要)

    1
    sudo apt install gcc-multilib
  7. ~/.local/bin放入环境变量(pwntools自带一些工具)

    1
    2
    # 可以把这一行放入~/.zshrc或~/.bashrc
    export PATH="/home/ylcao/.local/bin/:$PATH"
  8. Libc偏移搜索工具lieanu/LibcSearcher: glibc offset search for ctf.

  9. 更新libc数据库

    1. 删除clone的文件夹里的libc-database,然后

      1
      git clone https://github.com/niklasb/libc-database.git && cd libc-database && ./get ubuntu

使用peda插件(pwndbg安装出现很多问题)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# 载入一个文件
$ gdb {file}
-cd:设置工作目录;
-q:安静模式,不打印介绍信息和版本信息;
-d:添加文件查找路径;
-x:从指定文件中执行GDB指令;
-s:设置读取的符号表文件。
# 或者进入gdb后:
file {file}

# 运行/重新运行
r

# 继续运行
c

# 显示源程序代码的内容,包括各行代码所在的行号
l

# 下断点
b <行号>
b <函数名称>
b *<函数名称>
b *<代码地址> d [编号]
b +/-offset # 在当前暂停位置的偏移下断
tbreak # 只作用一次
rbreak regex # 在正则匹配的函数名开头断点 不会一次消失

# 查看断点
i b
# i 用于查看各类信息

# 删除断点
d 断点序号

# 查看栈
stack <行数>

# 针对源代码的单步
n # 步过
s # 步进

# 针对汇编指令的单步
ni
si

# 显示变量的值
p <value>

# 退出
q

# 查看帮助
h

# 反汇编
disass

# 查看各种数据
x/i
x/s
x/b
# 斜杠后加数字表示查看的数量

# 直接回车进行上一步操作


# 使用命令行参数
gdb --args 命令行+参数等

# backtraces查看堆栈调用:
bt # 显示所有的函数调用栈帧的信息,每个帧一行。
bt n # 显示栈定的n个帧信息。
bt -n # 显示栈底的n个帧信息。
bt full # 显示栈中所有帧的完全信息如:函数参数,本地变量
bt full n # 用发同上。
bt full -n #

例子:BUUCTF T2 rip

载入

查看main函数

给main下断

阅读全文


阅读李忠的《x86汇编语言从实模式到保护模式》时,遇到了要将二进制文件写入VHD文件的问题。Windows环境可以使用随书工具FixVhdWr,在Linux或Mac下可以使用dd工具。

On linux, you may create the vhd file via virtualbox first, and execute the command following to copy the content of the mbr sector into the vhd file. dd if=c05_mbr.bin of=LEARN-ASM.vhd bs=512 count=1 conv=notrunc With the option ‘notrunc’, the size of the output file will not change when it is bigger than the input file’s.

virtual machine - how can we write binary file to a VHD file on mac - Stack Overflow

1
dd if=二进制文件名 of=目标vhd文件 bs=512 count=1 conv=notrunc
阅读全文


post @ 2022-04-08

22.4.8更新

慢慢积累,不定更新

BurpSuite

简单的设置抓包等就不说了,只是记录一些使用方法或技巧。

Intercept响应无拦截

右键-Do intercept-Response to this request

拦截响应

或者发送到Repeater组件:

阅读全文


post @ 2022-04-08

一、GUI图形化渗透测试信息收集工具

项目地址:https://github.com/xzajyjs/ThunderSearch

二、一站式解决渗透测试的信息收集任务

项目地址:https://github.com/xzajyjs/SiteScan

三、RDP 渗透测试工具和脚本

项目地址:https://github.com/0x90/rdp-arsenal

四、红队作战中的一些工具分享

项目地址:https://github.com/r0eXpeR/redteam-tools

阅读全文


先说环境,我的测试手机为Redmi Note 8 Pro,bl锁已解,刷了crDroid Android 11类原生和Magisk 24.3

现在流行的Xposed刷入方法,主要是EdXposed和太极两种玩法。

先安装太极·阳:

太极下载 | 太极

安装好太极Apk后,下载 magisk-taichi-vx.x.x.zip,安装模块到Magisk,打开应用即可激活太极·阳

Xposed框架安装:

先安装EdXposed的Manager,作者是多个人的,更新不是特别勤快

Releases · ElderDrivers/EdXposedManager

安装好后,首页会多出来alpha和canary的选项卡,目前2022年4.7 Alpha版本已经完全支持Android11

下载后Magisk刷入,提示需要刷入Riru,在github上下载好后刷入Riru,再刷入EdXposed的模块

阅读全文


官网:Karabiner-Elements

功能强大,系统级调整

阅读全文


22.8.8更新

相关前言

简单来说因为开发者没有秉持“外部参数皆不可信的原则”进行开发,导致产品满足以下两个条件:

  • 攻击者可以控制要构造的参数
  • 参数带入数据库查询(直接拼接到SQL语句,没有作过滤处理)

SQL注入的常见类型

  • UNION query SQL injection(union查询注入)
  • Boolean-based blind SQL injection(布尔盲注)
  • Error-based SQL injection(基于报错的注入)
  • Time-based blind SQL injection(时间盲注)
  • Stacked queries SQL injection

MySQL一些重要数据库

在MySQL5.0版本后,默认在数据库中会存放一个”infomation_schema”的数据库。此库中有三个表:

  • SCHEMATA:存储该用户创建的所有数据库的库名。记录库名的字段名为SCHEMA_NAME
  • TABLES:存储该用户创建的所有数据库的库名和表名。字段名分别为TABLE_SCHEMA和TABLE_NAME
  • COLUMNS:存储该用户创建的所有数据库的库名、表名和字段名,字段名分别为TABLE_SCHEMA、TABLE_NAME和COLUMN_NAME

基础SQL语句

阅读全文


post @ 2022-04-06

Tmux 是一个终端复用器(terminal multiplexer),非常有用,属于常用的开发工具。

一、Tmux 是什么?

1.1 会话与进程

命令行的典型使用方式是,打开一个终端窗口(terminal window,以下简称”窗口”),在里面输入命令。用户与计算机的这种临时的交互,称为一次”会话”(session) 。

会话的一个重要特点是,窗口与其中启动的进程是连在一起的。打开窗口,会话开始;关闭窗口,会话结束,会话内部的进程也会随之终止,不管有没有运行完。

一个典型的例子就是,SSH 登录远程计算机,打开一个远程窗口执行命令。这时,网络突然断线,再次登录的时候,是找不回上一次执行的命令的。因为上一次 SSH 会话已经终止了,里面的进程也随之消失了。

为了解决这个问题,会话与窗口可以”解绑”:窗口关闭时,会话并不终止,而是继续运行,等到以后需要的时候,再让会话”绑定”其他窗口。

1.2 Tmux 的作用

Tmux 就是会话与窗口的”解绑”工具,将它们彻底分离。

(1)它允许在单个窗口中,同时访问多个会话。这对于同时运行多个命令行程序很有用。

(2) 它可以让新窗口”接入”已经存在的会话。

(3)它允许每个会话有多个连接窗口,因此可以多人实时共享会话。

(4)它还支持窗口任意的垂直和水平拆分。

阅读全文


c++编译后会给函数签名加上很多特有的修饰,比如bool ReqGetGuildUserList(long)将会被编译成:

1
?ReqGetGuildUserList@@YA_NJ@Z

Dependency Walker这个工具可以看的很清楚的。

     Dependency Walker工具一般是用来查看dll或者exe的依赖项的,这样就可以在软件发布的时候避免漏掉某些dll,当然对于动态加载的dll是没有办法的。但其中的Undecorate C++ Functions功能也甚是好用。

编译后的dll导出签名格式

功能强大的Undecorate C++ Functions

Undecorate后的C++签名,这样就看的很清楚了

阅读全文


DASCTF,easyre签到题,ASPack,脱壳后找到关键函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
int __cdecl sub_401771(char *Str)
{
int v2[50]; // [esp+1Ch] [ebp-DCh] BYREF
int v3; // [esp+E4h] [ebp-14h]
int j; // [esp+E8h] [ebp-10h]
int i; // [esp+ECh] [ebp-Ch]

v3 = strlen(Str);
sub_401500();
sub_40152B();
sub_401593();
sub_401619(Str, v3);
for ( i = 0; i < v3; ++i )
byte_492A60[i] = (LOBYTE(dword_492940[i]) ^ Str[i]) + 71;
memset(v2, 0, sizeof(v2));
v2[0] = -61;
v2[1] = -128;
v2[2] = -43;
v2[3] = -14;
v2[4] = -101;
v2[5] = 48;
v2[6] = 11;
v2[7] = -76;
v2[8] = 85;
v2[9] = -34;
v2[10] = 34;
v2[11] = -125;
v2[12] = 47;
v2[13] = -105;
v2[14] = -72;
v2[15] = 32;
v2[16] = 29;
v2[17] = 116;
v2[18] = -47;
v2[19] = 1;
v2[20] = 115;
v2[21] = 26;
v2[22] = -78;
v2[23] = -56;
v2[24] = -59;
v2[25] = 116;
v2[26] = -64;
v2[27] = 91;
v2[28] = -9;
v2[29] = 15;
v2[30] = -45;
v2[31] = 1;
v2[32] = 85;
v2[33] = -78;
v2[34] = -92;
v2[35] = -82;
v2[36] = 123;
v2[37] = -84;
v2[38] = 92;
v2[39] = 86;
v2[40] = -68;
v2[41] = 35;
for ( j = 0; j <= 41; ++j )
{
if ( v2[j] != byte_492A60[j] )
exit(0);
}
return sub_47BAB0((int)off_488140, aRight);
}

可以看到逻辑很简单,但是这里有int和char的强转问题,直接python逆向,会出现超出有符号char类型范围的问题。可以看到强转的汇编位置:

所以编写脚本的时候必须舍弃高位,低8位要和0x7F相与

wp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# coding : utf-8

tar = [-61, -128, -43, -14, -101, 48, 11, -76, 85, -34, 34, -125, 47, -105, -72, 32, 29, 116, -47,
1, 115, 26, -78, -56, -59, 116, -64, 91, -9, 15, -45, 1, 85, -78, -92, -82, 123, -84, 92, 86, -68, 35]

key = [0x38,0x78,0xDD,0xE8,0x00,0xAF,0xBF,0x3A,0x6B,0xFB,0xB8,0x0C,0x85,0x35,0x5C,0xAD,0xE6,0x00,0xE0,0x8A,0x1D,0xBD,0x46,0xD2,0x2B,0x00,0x15,0x24,0xC6,0xAD,0xA1,0xC9,0x7B,0x12,0x28,0x00,0x05,0x00,0x72,0x3E,0x10,0xA1]



for i in range(42):
print(chr(((tar[i] - 0x47) ^ key[i]) & 0x7f), end="")

print()

阅读全文
⬆︎TOP