writeup_level2_pwn
writeup_level2_pwn属于是level0的升级版,没啥可查的,直接ida:
可以看到,依然是有缓冲区溢出漏洞的一个函数,buf数组的大小转换成十六进制也就0x88,却能读入0x100的数据。
依然是通过溢出,对函数的返回地址进行覆盖:
进入调用函数system,然而system函数需要一个参数的地址(即/bin/sh)字符串的地址,我们没有该字符串,无法虚空调用,只能在程序的字符串列表中进行寻找:
view-subview-string可以看到系统贴心的准备了:
现在我们就可以在调用_system函数时,通过缓冲区的覆盖把字符串的地址也提前覆盖进去:
创作一下脚本:
行!
cyberpeace{40fb2960396105316b3733bd0c6cf1fd}
writeup_level0_pwn
writeup_level0_pwnida打开附件:
可以看到read函数把int读入数组,有溢出漏洞,然后找到程序中的危险函数:
只要成功对此函数实现调用就可以通过sh命令行控制系统。
查看数据区域,可以看到上面贴心的给出了解释,r和s代表了程序的返回地址和储存的寄存器值,我们只要通过缓冲区溢出覆盖程序的返回地址,将返回地址覆盖为我们的目标函数起始地址,即可执行该函数。
起始地址锁定为596,直接脚本抄袭开始!
12345678910# coding=utf-8 from pwn import * #导入 pwntools 中 pwn 包的所有内容 p = remote('111.198.29.45',33907) # 链接服务器远程交互 elf = ELF('./level0') # 以 ELF 文件格式读取 level0 文件 sysaddr = elf.symbols['callsystem'] # 获取 ELF 文件中 callsystem 的地址 # 先用 0x88 个无用字符覆盖 buf 和 push ...
writeup_easyMaze_reverse
writeup_easyMaze_reverseelf文件,直接ida:
main函数里定义了一大堆变量。
为了便于分析,从step_2开始看起:
循环校验输入(WASD),然后按照输入内容控制输出相关结果。
再看加密逻辑:
step_0貌似是在生成地图
step1中还有子调用,太麻烦了,因此直接选择动态调试,在step2直接查看数据。
连接linux开始动态调试:断点下载step_2的循环开始处:
双击a1数组查看变量:
很多0和1组成的数组,d键位转化为dd,然后右键生成数组,长度为49
(dd定义双字类型变量,一个双字数据占4个字节单元,读完一个,偏移量加4;)
复制,生成地图:
按照地图,应该为 SSDDWDWDDDSSAASASAAASSDDDDWDDS
最终flag:UNCTF{ssddwdwdddssaasasaaassddddwdds}
汇编 db,dw,dd的区别
汇编 db,dw,dd的区别db定义字节类型变量,一个字节数据占1个字节单元,读完一个,偏移量加1;
dw定义字类型变量,一个字数据占2个字节单元,读完一个,偏移量加2;
dd定义双字类型变量,一个双字数据占4个字节单元,读完一个,偏移量加4;
dq定义四字节类型,一个四字类型数据占8个字节单元;
格式:〔符号名〕 DB\DW\DD\DF\DQ\DT 初值序列DB定义的为字节类型,DW定义字类型,DD定义双字类型,DF为长字类型,DQ为四字类型,DT为十字节类型,该指令分别定义8位,16位,32位,48位,64位,80位的数据
DW就是表示为该数据分配一个字的存储空间,即16位
摘抄自:https://blog.csdn.net/baidu_37503452/article/details/83147318
writeup_梅津美治郎reserve
writeup_梅津美治郎reserve查壳,没壳
ida打开:
level1太简单不说,r0b0RUlez!
直接,步入sub_4015EA
发现有一个九次的小递归:
判断有猫腻,直接上动调,然而x32dbg怎么调都是一个异常终止。
查wp,改用虚拟机下的od,可以正常运行,简单的概述一下具体情况:
在运行完int3语句后,程序跳转到7地址开头系统领空,一段时间后,再次调用了4开头的正常函数,可以猜到应该是level2的主函数:
逻辑很简单:
直接比较了v1和另一串字符。
打开比较函数:
可以看到是将a2异或2后进行的比较,至此比较流程已经清晰,下面找到a2就可以解决问题。
依然需要动调:
可以看到数据窗口中显示的就是实际参与比较的a2字符串(以02结尾),我们直接解密:
为welldone字样,然而这还不是最终flag。。。
最终的flag是第一层的结果下划线第二层的结果,即:
flag{r0b0RUlez!_w3lld0ne}
坑爹啊。。。
writeup_攻防世界_WindowsReserve2
writeup_攻防世界_WindowsReserve2首先,除了攻防世界的wp以外,网上关于这题的wp我个人都认为不太详细
有as壳,esp定律手动脱壳。
拖入ida,根据功能对函数进行重命名:
锁定关键函数:
①检查输入函数:
②加密函数:
最后一位通过v9和v4加密,存入了v10
进入下一层逻辑:
仔细观察逻辑发现有一个密码表,通过python脚本转化一下:
发现还是经典base64,仔细观察代码逻辑,推测是base64加密函数。
因此,可以对程序的总体流程进行推测:
传入加密函数,分奇数偶数位进行加密
加密后的内容进行base64编码(结果为reverse+)
然而,对reverse+进行解码却发现解不开。。。这应该是其解码之后的结果无法打印
遂自己写脚本如上,左侧为输出。
然后回到上一层函数
上一层函数的输出为173,235,222,174,199,190
因此可以初步判断本层函数的输入应为12位,由于可能性较少,可以直接正向碰撞,可能性仅仅有12*(10+6)种,直接复刻正向逻辑:
首先,上面的一大串加密逻辑的输出结果只可能是整数0~15
然后使用0~1 ...
base64编码、解码c语言实现
搬运自:https://blog.csdn.net/qq_26093511/article/details/78836087
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116#include<stdio.h>#include<stdlib.h>#include<string.h>unsigned char *base64_encode(unsigned char *str) { long len; long str_len; unsigned char *res; int i ...
python_re爬虫模块(RE、BS4、Xpath)
python爬虫模块(RE、BS4、Xpath)一、RE模块基本使用:findall:匹配字符串中所有符合正则的内容
finditer:匹配内容后返回迭代器,从迭代器中取数据可以用循环加.group()
search:找到一个结果就返回,返回的结果是match对象,取数据可以用.group()
match:从头开始匹配,从第一个字母匹配不到就没有(不常用)
其中,上述内容的调用通过: ret=re.findall(r'正则串','匹配目标串')实现调用。
预加载:预加载正则表达式(用于正则表达式较长、且多次使用时的封装)
格式为:
1234obj = re.compile(r"\d+")ret = obj.finditer("目标字串666")for it in ret: print(it.group())
内容提取: 正则可以用来匹配固定格式的一串字符串,如<html>xxx<html>,然而当我们不想要两侧的,只想要xxx时,需要从正则中取出不重复信息,即内容提取。 ...
python异步爬虫基础
pyhton异步爬虫基础一、多线程/多进程多线程:1234567891011121314# 多线程from threading import Thread # 线程类#实现方法1:def func(): for i in range(1000): print("func", i)if __name__ == '__main__': t = Thread(target=func) # 创建线程并给线程安排任务 t.start() # 多线程状态为可以开始工作状态, 具体的执行时间由CPU决定 for i in range(1000): print("main", i)
1234567891011121314#实现方法2:class MyThread(Thread): # def run(self): # 固定的 -> 当线程被执行的时候, 被执行的就是run() for i in range(1000): print("子线程", i ...
pwn栈基础
PWN_栈基础程序段结构图:
栈结构图:
栈在内存中向下增长(地址下降)。每个函数有自己的栈空间,从栈底(高地址)向栈顶(低地址)增长,函数与函数之间被称为栈帧。
其中, EBP指向栈底;ESP指向栈顶;