格式化字符串:修改返回地址
IDA进程序看下,发现printf(s)存在格式化字符串漏洞,且第一次fgets输入字符1会执行close_borders,其实执行no_panic也同理,方便起见只演示下close_borders
checksec下,relro保护全开,got表地址改不了,pie也打开了,地址是随机的。
在ida里仔细找找,发现题目给了win()函数,但pie是打开的,ida里显示的是偏移地址
gdb调试下,输入的值是格式化字符串的第6个参数
rbp是第14个参数,返回地址是第15个参数,rbp的值与栈上储存返回地址的地址偏移为0x8
得到基址0x555555554000
基址+偏移,得到win函数的真实地址,计算其与返回地址的偏移(偏移是固定的),即0x55555555484-0x555555555165=0x31f
确定下思路,先用第1个printf泄露出rbp,返回地址的值,rbp的值-0x8得到储存返回地址的真实地址,返回地址的值-0x31f得到win函数的真实地址。再通过第2个printf将储存返回地址的真实地址写入,修改为win函数的地址即可。注意,第二次写入 ...
格式化字符串:更改got表
前两行memset将s,format中的值全部置为0,sprintf函数将s中的值与Repeater:拼接为一个字符串后存放在format中。printf(format)存在格式化字符串漏洞。
checksec下,relro保护半开,可以更改got表。
当RELRO保护为NO RELRO的时候,init.array、fini.array、got.plt均可读可写;为PARTIAL RELRO的时候,ini.array、fini.array可读不可写,got.plt可读可写;为FULL RELRO时,init.array、fini.array、got.plt均可读不可写。
gdb下,确定格式化字符串的位置
发现有两个地方存放着aaaaaaaa,这是为什么呢?看一眼ida,输入的字符串先存放在s中,然后与Repeater:拼接存入format。为了方便起见,我们选用上面的作为参数。计算下偏移
确定下思路,更改strlen的got表地址为system的地址,下一次循环再发送/bin/sh完成调用。
首先需要泄露出system的真实地址,我们在栈上找出了(__ ...
实验6:将data段中每一个单词的前4个字母改为大写字母
123456789101112131415161718192021222324252627282930313233assume cs:code,ss:stack,ds:datastack segmentdw 0,0,0,0,0,0,0,0stack endsdata segmentdb '1. display 'db '2. brows 'db '3. replace 'db '4. modify 'data endscode segmentstart: mov ax,stackmov ss,axmov sp,16mov ax,datamov ds,axmov bx,0mov cx,4s0: push cxmov si,0mov cx,4s: mov al,[bx+3+si]and al,11011111bmov [bx+3+si],alinc siloop sadd bx,16pop cxloop s0mov ax,4c00hint 21hcode endse ...
实验4:[bx]和loop的使用
1234567891011121314编程,向内存 0:200至0:23f 依次传送数据 0至63(3fh)assume cs:codecode segmentmov ax,20mov ds,axmov bx,0mov cx,64s: mov ds:[bx],blinc bxloop smov ax,4c00hint 21hcode endsend
程序基础概念
1.a.c预处理为a.i编译为a.s汇编为a.o链接为a.exe。
2.进程是动态的,有生命周期,动态生成,动态消亡。程序是静态的,是指令与代码的集合。一个程序至少有一个进程,一个进程至少有一个线程,进程是资源分配的基本单位,线程是调度的基本单位。
3.windows中.exe .dll .sys均为pe格式,Linux中.elf为pe格式.
4.eop为程序的入口点,oep为原入口点。程序可能套壳,壳的入口点为eop。壳运行时还会到原入口点执行,称原入口点为oep。imagebase为内存基地址,默认为0x000000。VA为pe文件在内存的虚拟地址。RVA是相对于imagebase的虚拟地址。RVA=VA-imagebase。VOFFSET是pe文件节的起始地址相对于imagebase的偏移(内存中相对于imagebase的偏移)。Roffset相对于文件在磁盘首地址的偏移。Voffset(内存)=节的起始地址(虚拟地址)-imagebase地址。Roffset(磁盘)=节的起始地址-文件的首地址(磁盘)
PE文件是一种Windows可执行文件格式,包 ...
Helloworld
hello world的代码及注释1234567/* this is the first c program */ #注释include <stdio.h> #头文件int main(void) #main函数(返回值,函数名,参数){ printf("hello world"); #打印 return 0; #返回语句}
编写,编译,运行,调试
debug
便于一步步调试
release
更精简
x86
32位
处理器,寄存器处理4个字节
内存寻址32位
x64
64位
处理器,寄存器处理8个字节
内存寻址64位
.cpp与.c的区别
cpp语法更为严格
cpp可以在后定义变量
Linux编写,编译,运行,调试1234vim hello.cgcc hello.c -o hello #编译gdb hello.c -o hello_g -g #编译为debug版本gdb hello_g #打开
一些常用gdb命令1234567891011121314b 行号:打断点info b:查看断点d 断点编号 ...
Linux常用指令
Linux常用指令cd 目录切换12cd / #根目录cd /home #home目录
mkdir 创建空目录1mkdir test1 #创建test1目录
rmdir 删除空目录1rmdir test1 #删除test1目录
cp 复制1cp 1.txt /test1 #将1.txt复制到test1目录
mv 移动&重命名12mv 1.txt /test1 #将1.txt移动到test1目录mv test1 test2 #将test1重命名test2