01-A Tour of Computer Systems-计算机系统漫游
计算机系统由硬件和系统软件组成,他们共同工作,但是具体的实现方式随着时间不停变化。不过系统的内在概念没有改变。我们可以通过理解软硬件的相互工作,深入理解来明白这些组件是如何影响程序的正确性和性能。不过这一切的一切我们大抵都要从我们的HelloWorld开始。byd兜兜转转还是回到了HelloWorld对吗? 好的,先让我们找个傻逼代码: 1234567#include<stdio.h>int main(){ printf("hello, world\n"); return 0;} 1.1 信息 = 位 + 上下文helloword程序的生命周期是从一个源文件开始的。程序员通过编写文件《hello.c》——一堆由0和1组成的位序列,8个组成一组,成为字节。由字节来表示程序中的大部分文本字符。 啥?详细的表示你去看ASCII就好了,这个应该只要学过计算机都知道。像这样用ASCII码组成的文件都叫做文本文件,其他的我们统称为二进制文件 1234为什么用C语言呢?因为C语言是一个与Unix内核相关的语言,大部分...
00-Preface-导读
本笔记基于CS:APP3e,也就是Computer Systems: A programmer’s Perspective。 作为一名优秀的程序员,或者说要成为上个时代所谓真正名义上的“黑客”。这本书大约是必不可跳过的经典。 这本书的目的是让阅读者更好的理解什么是计算机,就这么简单。或这本书的直译是《程序员的角度理解计算机系统》。也就是为大部分软件开发者准备的。不过所有的笔记都是以我当前的视角来记录的。可能没有那么好理解。记录这个笔记也是为了让自己可以快速复习。相当于外置大脑了。 我看的书都是从第一张开始的,不过网上会有一些公开课之类的东西。在里面举了一些例子。对于现在的我而言是知道一些浅显的原因却不知道原理。例如用GDB执行几个简单的运算: 稍微学过C的都知道,int类型会有一个范围,大概是-2^32~2^32这么一个范围,如果超出之后就会出现错误。其原理是: 当数据是这样的时候,如果再+1则会变成-1. 本质上是系统或者说编译的时候对数值的处理上与人类的理解有所偏差。 还有一些有趣的C语言程序: 1234567891011121314151617181920212223...
shellcode - alpha3.py
下载ALPHA3ALPHA3实际上只是配windows,不过有国人制作了适配linux版本的。因为我的环境大多数都是在linux上,所以我直接下载国人修改制作的适配linux版本的ALPHA3:(我也只写了linux教程) 1git clone https://github.com/TaQini/alpha3.git 我把这个py脚本git到了我的~/Software文件夹下。 直接运行会报错。我是真不理解这是什么错误。上网找了一些教程,最终发现感觉这个文件只支持python2运行。 那么我就要在我的ubuntu里面安装一个python2环境,还要和python3环境兼容 python2环境 这个时候,我们可以用python2来运行程序了。 使用用起来太麻烦了,每次都要进入这个傻逼目录里面他妈的调用这个傻逼脚本的话,太他妈的麻烦了。我决定创造一个链接,让我可以无时无刻用。 为此我要创建一个叫做.links的隐藏文件夹在我的用户目录下,然后往里面塞链接。 12mkdir ~/.linkssudo ln -s ~/Softwares/alpha3/ALPHA3.py ...
其他-gcc指令
基础指令最基本的GCC编译命令格式: 1gcc [选项] [源文件] [选项] [目标文件] -o:将C源文件编译成可执行文件 -g:生成时候带有debug信息 常用命令123456789#32 位保护全关的编译命令gcc -m32 -fno-stack-protector -z execstack -no-pie -fno-pic -O0 -U_FORTIFY_SOURCE -o program32 program.c#64 位保护全关的编译命令gcc -m64 -fno-stack-protector -z execstack -no-pie -fno-pic -O0 -U_FORTIFY_SOURCE -o program64 program.c#32 位保护全关且关闭编译器警告命令gcc -m32 -fno-stack-protector -z execstack -no-pie -fno-pic -Wno-implicit-function-declaration -o program32 program.c#32 位保护全关且关闭编译器警告命令gcc -m64 ...
GDB_PWNDBG调试
简介下载什么就不多说了,我们直接讲使用。 GDB算是这个世界上最强的动态调试器了,而PWNDBG是GDB的一个插件,可以更好地展示GDB得到的一些内容,让我们方便理解。 GDB可以使用的功能包括且不限于: 运行 步入、步过、步出、步止 断点(设置、删除、显示) 查看内存、寄存器、各种参数 设置内存、寄存器、各种参数(加载文件) 远程调试 其他辅助功能 当我们要调试某个程序的时候,要输入: 1>gdb [文件名] 当我们忘记命令的时候,可以输入: 1(gdb)/(pwndbg) help 以Intel方式查看汇编代码(似乎pwndbg默认Intel汇编代码格式): 1(gdb)/(pwndbg) set disassembly-flavor intel 上述的查看反汇编格式,可以通过修改.gdbinit来完成。 12vim ~/.gdbinit(vim) disassembly-flavor intel 接下来 我们一点一点开始讲。 程序执行与控制执行程序及设置管理断点当我们要执行一个程序的时候,我们需要输入run(简写r)或者start 123(gdb)/(pwnd...
pwntools
下载python3版本这个就去看我写的pwn基础配置吧,一般而言不做老题目的话python3适配的pwntools完全够用了。不过我为了测试和学习一些老东西留下的宝贵信息,还是会用到适配python2的pwntools的。 pwn基础配置 python2版本pwntools 从 4.0 版本开始完全移除了 Python 2 支持,依赖现代 Python 特性(如 asyncio)。 现在想用pwntools的python2版本只能用pwntools 3.14.1 检查python2和pip212python2 --version # 应输出 Python 2.7.18pip2 --version # 应输出 pip 20.3.4 或类似版本 一般而言,可能没有python2.可以去看我写的另外一个工具笔记: python2环境 如果上面ok了 12pip2 install --user pyelftools==0.27pip2 install --user --upgrade 'pwntools<3.15' 使用pwntools的使用非常简...
shellcode1_dahuan02
Shellcode、ORW 依旧是大欢老师给的shellcode题目。 checksec一下,里面大概是这样的。 一些保护其实可以通过逆向后的代码看出来。不过我们依旧按照正常流程走一遍就好了,也花不了什么时间,就是大概了解一下。 直接看代码: 我们在编译main函数的时候会触发一个问题,他说这个0x40133B这一行(也就是call rdx)这里有问题。我们先看一下这几句话吧。 这边大概可以看到,在read函数之后,程序有一个jle指令(jle是jump if less or equal,小于等于时候跳转),也就是跳转。跳转到下面之后会报一个stack_chk_fail的错误,也就是什么栈检测报错。反正我们就把它当作一个栈保护就行了,也就是说我们最好不要跳转。再回到上面报错的这一行,是一个call rdx…也就是执行rdx里面的内容。 怪不得报错呢,因为这一行直接执行相当于一个call指令,但是没有call任何的函数,而是一个寄存器,所以我们没有办法把他反编译成伪C里面的“调用了什么函数”如此这般的写法。 所以我们选中这一句call rdx,右键给他暂时不反编译就好了:...
main_dahuan01
其他类型 这个是大欢老师给我的一道金科师傅的题目,让我做着玩,非常有趣。然后因为这个是前辈写的小玩意,我可能在写wp的时候会骂脏话,不过我会用*号替代大部分的。 先checksec一下看一下大概吧。 一道保护全开的题目,但是一般这种保护全开的题目要么很简单,要么就是难到完全做不了。不过大概率是前者。 大概玩了一下这个程序,是一个类似于银行系统,可以注册登录,存钱取钱。 首先打开IDA之后,要对代码逐步分析。特别是把里面的变量名改一下。就从register存钱的这个函数开始: 根据上下文,读懂代码之后很快就可以把大部分变量名给改好了,然后我们再去看有后门的函数menu,再对里面的一些变量名重新命名,这下我们大概就能看懂代码了。 我们了解一下,后门函数的触发条件是当uid==11451419的时候,就会触发。然后通过reg函数和save函数,大概可以看出来,每次我注册的的时候,uid就会++。也就是当我注册第11451419个账户的时候,我就可以很自然的获得管理员权限。 所以第一种解决方案就是注册11451419个账户。很显然这个非常的愚蠢而且不实际…不...
dahuan_GuessNumber
随机数 大欢出的一道屎题、不过也算很有意思了。 核心思想就是进入一个func函数中,连续猜对20次数字便可以进入到一个叫做flag()的函数里 flag函数就是一个获取buf,然后把你输入的buf放入system里面来运行的玩意。而且没有可供栈溢出的空间。 在把buf传给system之前会有一个filter函数,这个里面会用str来对比字符串,如果我输入的东西里面有什么值被程序制作着定义为“不可以输入的”那么就会直接退出程序: 简直就是把可以禁用的全禁用了。 猜数字其实才是要记录的核心,就是用LibcSearcher库里面的cdll.LoadLibrary函数。因为我们的srand使用的time函数,是在题目所诞生的环境里诞生的。按照道理同一个环境的电脑同一时刻用time(0)作为种子生成出来的随机数一定是一样的。所以我们用附件里面的libc来生成随机数即可。 exp: 12345678910111213141516from pwn import *from ctypes import *from LibcSearcher import *context(log_l...
inndy_rop
ROP-ret2syscall 栈溢出 https://buuoj.cn/challenges#inndy_rop 开了栈堆执行保护,有很多函数应该是静态链接,然后main函数里面有一个overflow,纯粹的小栈溢出。 这道题的思路大概是这样的:通过不断地创造return,跳转,来执行很多语句。 我们的目的是执行一个execv(“/bin/sh”),首先先要塞入/bin/sh,通过read函数来塞入到.bss段,然后再通过execv(.bss_addr)的内容即可. .bss段有好多空缺的部分啊,随便找个地址吧:bss_addr = 0x080EC010 然后让我们回忆一下这几个参数:首先int 0x80是syscall的作用,第一参数为eax,也就是调用int 0x80对应的函数。例如read是0x03,execv是0x0b 然后read和execv都有三个参数,在系统中,某个函数的第一参数是ebx,第二参数是ecx,第三参数是edx。如果加上int 0x80的用于选择调用系统函数的第一参数的话,上面就分别是第二参数到第四参数...










