真理教教会

学习是美德,知识是财富,求道是目的

0%

https://0xinfection.github.io/reversing/pages/part-22-asm-program-1-moving-immediate-data.html

虽然文章给了很多信息,但对某些核心的要点表述太多,还好我有文心一言

内存空间

linux系统的内存空间分为:USER SPACE 和 LINUX KERNEL SPACE

其中,汇编产生的程序,其运行时的内容都在USER SPACE,int 80h在这里出现

其工作流程是:

  1. 准备参数:
    1. %eax寄存器:用于存放系统调用号,即要执行的系统调用的唯一标识符。
    2. %ebx%ecx%edx等寄存器:用于按顺序存放系统调用所需的参数。对于需要超过三个参数的系统调用,可能还会使用%esi%edi%ebp寄存器,或者在内存中分配空间并通过寄存器传递指向该空间的指针。
  2. 保存上下文,例如USERSPACE里的下一条指令,FLAGS和重要的寄存器数据,它们都会推送到栈里
  3. 跳转到中断描述符表(IDT)(或者中断向量符表)的第0x80项:中断服务例程(ISR)(下面有解释👇)
  4. 根据寄存器的内容,执行特定的系统调用
  5. 执行完之后,从内核态转到用户态 这个过程叫IRET
  6. pop被保存的上下文,即来到int80h下的第一条指令

中断向量符表

Interrupt Descriptor Table

其前身(不确定)Interrupt Vector Table

在内存的最底部,段地址和偏移地址都为0的地方,存在名为Interrupt Vector Table的数据结构
其包含256个条目,每个条目有4bytes,每个条目都是一个内存地址称为中断向量

其中第0x80项:中断服务例程(ISR)会读取%eax寄存器中的系统调用号,并根据该号码查找并调用相应的系统调用处理函数

总结

int 80h是进行系统调用的方法

https://www.youtube.com/watch?v=A5uz6LWeLPM

磨听力时看到的视频,讲了如何学习英语语法并有效寻找纠正语法错误的方法

这分为一下几个步骤:

  1. 找出语法错误和弱项
  2. 确认问题属于:form or function (用法错误还是压根不认识不会用)
  3. 制作template 把句型提取出来 用n种方式补全 (I haven’t ··· yet today )

关于步骤一,平时没有积累,不知道弱项怎么办的?
网上找篇文章,读个2-3遍,用自己的英语写一遍,丢给AI

这是吾爱破解上的软件破解入门教程, https://www.52pojie.cn/thread-1358649-1-1.html
浅尝辄止了一下,记录一点小小的收获

软件破解是逆向工程的一个分支,是绕过软件创作者的使用限制的技术
要破解的有两个方面:

  1. 注册验证
  2. 反调试

注册验证

也就是向软件证明自己的身份,来告诉创作者:我是付过钱的

验证方法有:本地验证和网络验证
本地验证又有:

  1. 重启验证:注册不过期,例如使用注册码后,软件在注册表创建“已注册”的标志,每次软件打开都会先读取一次注册表
  2. 非重启验证:注册会过期,例如账号密码验证,每次重启软件都要重新输入账号密码

这套教程只讲解本地验证的破解方法

反调试

其手段大致四类:

  1. 通过环境查看手段,判断是否有调试器打开,例如看进程
  2. 对用户正在使用调试器的行为进行动态识别,是不是正在用调试器对软件进行调试和修改
  3. 对软件完整性进行检测,例如把加壳后的软件解壳,软件的体积和内容发生更改后,会被检测到
  4. 干扰处理:就是让你看不懂,加壳、加花、虚拟化代码

如何破解?

用反汇编器和调试器下断点,找关键代码,并进行适当的修改——打补丁
常用的工具例如ida和ollydbg
然后,要用吾爱破解专用ollydbg,因为有插件

怎么下断点?

  1. 关键字
    软件的内容分为指令和数据,在指令和数据区搜索“登录失败”之类的关键词就能锁定关键代码的位置
  2. api
    通常软件的弹窗、按钮等的功能都是对系统api的调用,而不是软件开发者花时间自己的写的
    搜索对应的api,下断点
    动态调试这个软件
    就能找打关键指令的位置

找到关键指令了,下一步?打补丁

阅读它,你需要能看懂汇编代码,你需要了解寄存器,你需要着重学习push、pop、call、ret、jmp和各种变体指令,如果你能懂call stack就更好了
PS: call stack 这个wanwan破解并没有教,如果你感兴趣,你可以穿越到几个月前访问begin.re学习这个知识,它下架了:(

假如这是个要本地登录的软件
你可能看指令的时候,看到“登录成功”和“登录失败”的弹窗指令,它们挨的很近
你只需要找到附近的je指令(也可能是jle或jge)改成jmp,跳过“登录失败”的弹窗指令,来到“登录成功”的指令

这会导致什么结果呢?你怎么登录都会显示“登录成功”,因为你无法“登录失败”

总之

破解的流程是:
找关键代码》分析〉跳过失败的指令》破解成功

我不太想在软件破解上更进一步,卖破解软件是要吃牢饭的

靶机地址:https://www.vulnhub.com/entry/gigachad-1,657/

要点

  1. 开启的ftp服务是能匿名登录的
  2. 根据ftp里那个的提示,了解了一个username,可以从web上获取一张藏有密码提示的图片
  3. 图片里没有用到隐写,应该去google上搜图
  4. find可以找到,靶机里有个s-nail-privsec的SUID文件,在exploitdb上找相关的exp就能提权

文章讲解:
https://nepcodex.com/2021/07/gigachad-walkthrough-vulnhub-writeup/
https://bugzilla.redhat.com/show_bug.cgi?id=CVE-2017-5899

结果



有趣的东西

the real gigachad

关于靶机根目录里留下的图片,可以获取一下信息:

1
2
3
4
5
6
演员的维基介绍 https://tr.wikipedia.org/wiki/Sefa_Zengin

2003-2004 - Kurtlar Vadisi - Erdal Kömürcü

土耳其惡狼谷 英文名:Valley of the Wolves 土耳其名:Kurtlar Vadisi
Erdal Kömürcü是该系列的一名角色

大多数是土耳其语,并且目前的翻译软件比较垃圾,又懒得看,就只能给出这点东西了

rabbit hole

dirsearch 扫描web的时候会冒出来一堆莫名其妙的东西,我也不知道这个叫什么,在 https://nepcodex.com/2021/07/gigachad-walkthrough-vulnhub-writeup/ 里被叫做兔子洞,但我直接搜会搜到别的东西

https://rabbithole.gg/
web3,学不会一点(−_−;)

1
2
3
/**
* 文档注释
*/

运行命令,生成文档注释对应的技术文档

1
javadoc 文件名 -d 指定目录

靶机简介

靶机链接: https://www.vulnhub.com/entry/dc-2,311/
靶机链接: http://www.five86.com/dc-2.html
系列:- DC

攻击流程

getshell

  1. 绑定ip和域名
  2. 通过wpscan获取用户名,并用cewl获取密码,制作成两个字典
  3. msf爆破,得到两个账户
  4. 通过其中一个账户,得到shell

提权

  1. 绕过rbash
  2. 尝试切换另一个账户,成功
  3. sudo -l发现git的委派权限
  4. git提权

工具和技术

cewl通过爬虫生成字典
rbash绕过

渗透过程及结果

查看网络

绑定域名和ip

第一个flag

制作网站登录爆破字典,爆出账户密码




拿shell

提权




总结反思

在打DC-2的时候,在最后的提权阶段,感受到了急躁
首先就是,在得到了flag2,得到了两个用户和密码的时候,没有去试ssh,而是先去看了writeup
然后就是里面cd命令回显rbash的时候,没有首先去搜rbash,而是去看了一眼writeup
最后就是,绕过rbash之后,也没有尝试使用su进行用户切换,而是去看了一眼writeup
受不了了

  1. 不要放过任何的回显
  2. 尝试每一个账户,在可登录的任何地方
  3. 每每感受到了障碍,就明晰进入下一步可能可以做什么?需要什么信息?当前有什么信息?可以用信息来干嘛?

参考资料

https://gtfobins.github.io/gtfobins/git/#sudo 提权
https://cloud.tencent.com/developer/article/1720937 修改环境变量中的PATH
https://www.freebuf.com/articles/system/188989.html rbash绕过

1
2
3
4
5
6
public class Hello {
public static void main(String[] args) {
// 生成一些简单的输出
System.out.println("Hello, World!");
}
}

这是一个java代码,很明显能看出这是输出Hello, World的程序
但是,我们需要看懂
什么是看懂:

  1. 知道对程序每个单词的称呼
  2. 知道程序每个单词的功能
  3. 知道单词与单词结合后的功能
  4. 知道如何运行程序
  5. 知道运行程序所需要的环境
Read more »