- 博客(31)
- 资源 (2)
- 问答 (3)
- 收藏
- 关注
原创 leetcode刷题
leetcode刷题日记<day 2021/10/20>453. 最小操作次数使数组元素相等 简单给你一个长度为 n 的整数数组,每次操作将会使 n - 1 个元素增加 1 。返回让数组所有元素相等的最小操作次数。示例 1:输入:nums = [1,2,3]输出:3解释:只需要3次操作(注意每次操作会增加两个元素的值):[1,2,3] => [2,3,3] => [3,4,3] => [4,4,4]示例 2:输入:nums = [1,1,
2021-10-29 20:56:20
679
2
原创 c++ primer 笔记
c++ primer 学习笔记变量列表初始化变量中有个列表初始化感觉挺重要的,列表初始化是c++11中的新特性,看书有点没看明白,看了两篇文章1,文章2感觉还挺清晰的.那么什么是列表初始化呢?其实就是一种新的初始化方式,适用于各种类型,可以直接在变量名后面加上初始化列表来进行对象的初始化。vector<string> articles={"a","an","the"};int a{111};列表初始化的一些规则:首先说下聚合类型可以进行直接列表初始化,这里需要了解什么是聚合类
2021-10-19 21:47:22
229
1
转载 C++提高编程
title: C++提高编程date: 2021-08-09 12:39:00tags:- -C++categories:- C++- 笔记cover: /img/c++.png相关视频——黑马程序员匠心之作|C++教程从0到1入门编程,学习编程不再难-(167-263)(1-83笔记)——链接(84-146笔记)——链接(146-166笔记)——链接[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q1MiOUlT-1632736048308)(/.
2021-09-27 17:47:59
350
1
原创 64位栈溢出简单rop与简单例题的复现
首先还是找到关键函数可以看到有read栈溢出漏洞,有system函数,查看字符串,还可以看到"/bin/sh",既然这样,我们便可以一步到位直接通过rop将/bin/sh装入system函数中getshell。如何通过rop实现传参呢?64位ELF是通过寄存器存放参数的,所以我们要想办法将/bin/sh放入rdi中并紧接着调用system函数。那么该如何实现呢?我们假设一下,先通过pop edi将/bin/sh的地址压入edi中,然后再执行ret,并将此时的esp所指向栈空间的值改为system函数
2021-09-18 14:33:15
677
原创 pwn2test
#include<stdio.h>int f(){ char arr[0x20]; read(0,arr,0x100); printf("%s",arr); return 0;}//编译命令 gcc -m32 004.c -o 004 -fno-stack-protector -no-pie// 005 gcc 004.c -o 005 -fno-stack-protector -no-pievoid backdoor(int
2021-09-16 12:40:50
173
原创 shellcode加载器
编写shellcode不能使用绝对地址,因为当我们加载到其他函数中时绝对地址储存的可能什么也没有,甚至是其他函数,所以当我们需要调用一个函数时,需要动态获取函数的地址实现调用。想要动态获取函数地址,可以使用以下函数GetProcAddress 从dll中获取函数的地址LoadLibraryA 将指定的模块加载到调用进程的地址空间中举个例子:LPVOID lp = GetProcAddress(LoadLibraryA("user32.dll"),"MessageBoxA");_asm{
2021-09-10 18:56:00
1595
原创 重学一下汇编
EAX:累加器 AccumulatorEBX:基础寄存器 BaseECX:计数器 CountEDX:数据寄存器 DataESI:源变址寄存器 Source IndexEDI:目的变址寄存器 Destination IndexESP:堆栈指示器 Stack PointerEBP:堆栈基址寄存器 Base Pointer虽然有这么多名称,实际上除了e
2021-09-04 21:37:06
212
3
原创 BUU_re_[ACTF新生赛2020]usualCrypt
首先拖入ida中int __cdecl main(int argc, const char **argv, const char **envp){ int v3; // esi int result; // eax int v5[3]; // [esp+8h] [ebp-74h] BYREF __int16 v6; // [esp+14h] [ebp-68h] char v7; // [esp+16h] [ebp-66h] char v8[100]; // [esp+18h] [
2021-09-04 12:17:21
229
原创 crackme杂记
关于PDB文件和debug的关系,PDB文件中存储着程序的符号文件,因为只是debug是放不下那么多的。易语言按钮事件特征码:FF 55 FC 5F 5E,准确来说是易语言控件消息的必经之地,包括时钟调用都一定会经过这个特征码。寻找易语言的MFC按钮事件特征,我们已经知道了MFC按钮事件的特征码,并且再_AfxDispatchCmdMsg函数中第四个参数是按钮的函数,可是当我们在易语言程序中这样寻找时,却发现,没找到特征码,是因为易语言并不纯粹是MFC,还包含了一些其他的东西,实际上易语言的按钮事件是.
2021-08-31 22:46:54
311
转载 在MFC中快速定位按钮事件的新方式
我在上一篇文章《 如何在MFC中定位按钮事件 》采用了寻找虚函数表的方法来寻找按钮事件,但是用不同版本的VS编译器编译出来的MFC程序,在进入afxWinMain入口前做了非常多的工作,而且在不同版本中所做的内容是不尽相同的。下图左边是vs6.0的MFC的调用堆栈,右边是vs2010的MFC的调用堆栈。在MFC程序中,有且仅有一个继承自CWinApp的类,而且这个类是全局的,只有一个,程序运行的时候已经初始化了。1,原理:继承自CWinApp的类和窗口的类在内存中有 static const A
2021-08-31 11:20:55
798
转载 通过分析调用堆栈定位MFC按钮事件
1,逆向分析这个东西的前提是你得懂这个东西,例如,就像逆飞机一样,你连飞机是什么都不知道,当然你也就逆不出来,逆之前, 你得自己会造飞机,只是你没有别人造的好。分析过程中,不需要弄懂每个细节,只需关注重点部分和整体流程。学会根据经验猜测。2,原理:我们新建的MFC程序,界面上就放2个按钮,事件处理函数随便写。然后我们在按钮那里设置断点。程序运行起来后,我们点击button1,程序就断下来了,然后我们就查看它的调用堆栈,谁调用了这个按钮处理函数,找到事件分发函数。_AfxDispatchCmdMs
2021-08-31 11:13:10
635
原创 crackme杂记007
花指令的特征:遇到这种指令,可以立即判断出这是一个花指令,所以花指令较多的话,我们也可以通过搜索代码的方式快速去除如上图,我们已经知道 E8 01 00 00 00 ?? ?? ?? ?? ?? C3 是花指令,所以我们直接搜索这擦混代码一个一个nop就可以了。易语言中的特征码:想要搜索易语言程序的特征码,最好在程序的开始位置搜索,1.字符串比较函数的特征码: test edx,3执行到这里停住以后,注意观察ECX,EDX寄存器,比骄傲的字符串一定就在这两个寄存器里面,并且我们可以放根据找
2021-08-23 23:38:22
151
原创 crackme杂记 006
c语言中什么函数执行的最早?main函数吗?不是,还有更早执行的函数,比如初始化全局变量的构造函数。我们都知道,od在反汇编一个exe的时候会停止在oep的位置上,那么有比oep还要更早执行的函数吗?有的,比如TLS。既然tls比ebp都早,那么我们是否可以利用到它呢?比如反调试,如下图代码#include<iostream>#include<tchar.h>#include"ntdll/ntdll.h"#include<windows.h>DWORD i
2021-08-22 23:08:02
127
原创 crackme杂记 005
加壳的程序的断点技巧:creatwindowsEXA ,creatwindowsEXW这两个函数是创建窗口函数,可以让我们在壳之前下断点。两个函数有什么区别呢?W是unicode编码,而A是ascii编码。而我们程序在调用API的时候,一般都会从A调用到W,就比如32位的程序,在64位的操作系统中,最后都会调用64位的API一样。当然也有例外,所以我们在下断点的时候最好两个函数都下断点。IDA快捷键: x可以查看引用函数的位置。ida有时候字符串感觉有些怪异的话,比如特别短,可能是因为unicode编
2021-08-21 22:54:19
138
原创 crackme杂记 004
创建窗口函数: CreatWindowsExA,有时候想要找信息窗口找不到的话可以通过这个函数查找。花指令:花指令就是类似于jmp,call,ret的指令用来影响我们正常进行反汇编,比如使用花指令的话,IDA就无法正常编译汇编代码。举例:如上图,我们自己写了一个裸函数,可以看到,先写一个jmp Lable,跳转到下面的Lable函数,然后通过 _emit 0e8h 写入一个e8,但是我们知道,e8是call对应的硬编码,所以od就会认为这是一个call ,但是call后面都会跟着一个地址啊,所以od
2021-08-20 23:17:41
90
原创 crackme杂记 003
关于dll劫持的一些补充:如何寻找dll文件,dll文件储存在两个文件夹中,一个是system32文件夹,一个是SysWOW64文件夹,但是前者储存的却是64位程序运行的环境,后者则是32位程序运行的环境。如何知道想要劫持的dll是否为系统重点保护的,可以查看注册表里的键值,路径如下,里面的dll都是受系统保护的HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\SessionManager\knowndlls当我们想要加载的是64位的dll,
2021-08-19 23:19:01
152
原创 crackme 杂记002
实现dll劫持:首先我们需要使用到工具:AheadLIB,这个工具可以帮我们生成dll文件的cpp代码。什么是dll劫持,就是利用程序运行时会通过搜索名字来运行dll文件的方式,自己生成一个同名的dll文件,并且放在程序的同目录下,从而使程序会使用我们自己生成的dll文件,当然程序仍会使用系统的dll文件,因为我们自己生成的dll文件有系统dll文件的入口,否则我们就需要将系统的dll文件的代码全部生成,那样工作量会非常大,所以dll劫持的意思就是先加载我们的同名dll文件然后继续运行系统的dll文件。
2021-08-18 21:07:54
218
原创 crackme杂记
创建一个线程使用 threadproc函数,可以在指定的函数地址创建一个线程,函数内写内容DWORD WINAPI ThreadProc(_IN_LPVOID lpparameter){ byte byteread=0; while(true) { ReadProcessMemory((HANDLE)-1(进程句柄,-1表示是自己的进程句柄),(LPVOID)004010A9(需要读取的起始地址,od里面查找函数的地址),&byteRead (存放数据的缓存区地址),1(要读取的字节
2021-08-17 20:15:22
84
原创 crackme 004
这道题是169道crackme 004先打开程序,程序如下图。根据同时下载好的txt文档可以知道,如果注册成功会出现朱茵的美图。好了,直接拖入od试一试。还是先试试中文搜索,可以发现有个注册成功字符串。那么我们直接双击进去,往上查找,可以看到一个jnz,但是是往上跳的,继续网上找,看到了一个关键跳 刚好跳过了注册成功,直接nop填充,破解成功。可以看到朱茵的美照。然后再试一试不用中文搜索的方法。查看一下api函数,emm…数不清有多少个,肯定搞不了了,还是算了,直接注册机吧。由于这个是del
2021-08-13 18:31:32
108
原创 期末c语言大实训图书管理系统
本次期末实训历经八天终于做完了,感觉对于能力的提升还是蛮大的,不管是对于代码能力还是各个方面来讲,也让自己看到了不足之处。话不多说直接上源码。链接:https://pan.baidu.com/s/1I0gB-9WMc52gf5-pFWBlPw提取码:z1in系统使用了链表来储存数据,并且使用了easyx制作了可视化界面并添加了鼠标操作。系统本身并没有什么优化,所以代码量很多,后期可能会做一些算法优化等等。person.h 头文件#define _CRT_SECURE_NO_WARNINGS #
2021-07-20 13:46:38
491
4
原创 2021-07-13
title: 关于vs编写函数时报错:没有与参数列表匹配的重载函数date: 2021-07-13 14:36:48top_img: /images/002.jpgcover: /images/005.jpgtags:c语言categories: c语言以下是报错界面与代码上网查了好多,了解了一下重载函数:举个栗子,假如我们想要一个打印函数,我们可以定义一个printf函数,可是,这个printf函数只能打印int类型,可我们还想要打印float类型怎么办,有的人可能会想用别名比.
2021-07-13 14:47:45
63
原创 nck课程笔记:破解补丁工具的使用
破解一个程序的时候我们可以通过搜索字符串的方式来寻找关键点,那么假如我们在编写一个程序的时候,怎么提防这种简单的暴破方式呢?上一篇文章中已经提到过od里面实现搜索字符串功能是一个插件,视频中的作者给我们展示了一下这个插件的源码,下图是插件的核心函数:可以看出,该函数显示读取整个模块的内存,然后开始寻找push,mov,lea指令,并读取他们的操作数,当他读到’\0’的时候就认为这是一个字符串,但是问题也来了,如下图我们可以看到,上图的push ebp中的ebp是以\0结尾的,但是很明显,这
2021-06-27 17:17:10
1665
2
原创 一个简单的小暴破
爆破的软件是自己编写的一个很简单的注册弹窗软件,用e语言编写首先我们需要理解程序验证的流程a、点击注册按钮b、读取注册码c、判断注册码是否合法d、提示用户是否注册成功暴破的时候我们就可以从以上四点为入手点,首先将程序拖入od,此时我们先找到读取编辑框内容的API函数:GetWindowTextA函数,ctrl+g转到该函数以后,设置一个断点,然后运行程序,但是我们发现运行不了,为什么呢?我们看一下对战窗口,可以看到函数的三个参数。第一个参数是:包含文本的窗口或控件的句柄。 第二个参数表示将接收
2021-06-24 17:16:11
115
2
原创 buuctf SimpleRev
每天一道ctf,能多不能少题目链接首先拖入ida打开以后查看main函数如图可以看出,Dercy函数里的信息很重要,双击进入Dercy函数,unsigned __int64 Decry(){ char v1; // [rsp+Fh] [rbp-51h] int v2; // [rsp+10h] [rbp-50h] int v3; // [rsp+14h] [rbp-4Ch] int i; // [rsp+18h] [rbp-48h] int v5; // [rsp+1Ch
2021-06-23 20:10:59
188
2
原创 BUUCTF reverse 刮开有奖
每天一道ctf,能多不能少题目链接下载好以后双击点开发现是这么个玩意儿,但我们却没法对它进行操作,好吧,查一下壳,然后直接用ida打开,查看主函数,这里我发现主函数是这种的学识短浅的我只能去百度,大概了解了一下:windows支持两种应用程序,一种是一种是基于控制台用户界面的应用程序(Console User Interface,简称CUI),另一种是基于图形用户界面的程序(Graphic User Interface,简称GUI)。然后main函数和WinMain函数分别是这两种应用程序的主函
2021-06-18 23:43:58
179
2
原创 main函数和WinMain 函数
Windows支持两种类型的应用程序:一种是基于控制台用户界面的应用程序(Console User Interface,简称CUI),另一种是基于图形用户界面的程序(Graphic User Interface,简称GUI)。main函数和WinMain 函数是分别做为CUI和GUI的进入点函数被使用的。但请注意一点,OS 本身不会调用我们编写的进入点函数(main 或WinMain),它调用的是C/C++运行期启动函数。————————————————版权声明:本文为CSDN博主「jia
2021-06-18 16:18:27
573
原创 2021-06-14
esp定律脱壳————————————纯属个人理解,如有不对求大佬指正。看了好多关于esp定律脱壳的文章,都没看懂,o(≧口≦)o,可能是本人太笨了吧。所以就来浅谈一下自己对于esp脱壳的理解。个人对于esp脱壳的理解是先把壳跑完,此时的oep就是真正的程序入口。然后再将源程序通过工具dump出来为一个exe文件,再进行一些修复操作,就脱壳完毕了。接下来是实战操作 ┭┮﹏┭┮ ,我直接通过buuctf里的新年快乐题目来操作吧。查壳首先拖入ide中,我们会发现只有两个函数,是不是很可疑,所以我
2021-06-14 18:04:44
109
2
转载 pe文件结构新增节
首先先了解一下节表如下图,打开一个exe文件,我们可以看到有多个节表。为什么要有这么多节表呢?每个节表都有自己的任务与功能,所以我们可以手动添加一个节来实现我们自己想实现的功能。然后我们在了解一下节表的主要成员:typedef struct _IMAGE_SECTION_HEADER { BYTE Name[IMAGE_SIZEOF_SHORT_NAME]; //8个字节名字.自己可以起.编译器也可以给定.不重要. union { DWORD Ph
2021-06-11 18:31:12
361
原创 pe文件结构在空白区添加代码
想要再空白区添加代码,首先我们需要清晰一下我们需要做的步骤。1.查找本机MessageBoxA地址2.打开OD调试工具拖入要添加的exe程序。3.在命令中输入 : (输入后按下回车键)4.找任意一段空白区添加上代码 (最好是添加到 空白区开始预留一行的位置,便于以后再添加更多代码节约空间)5.计算E8跳转的地址6.修改OEP (程序入口的点)预备知识汇编指令硬编码callE8 00 00 00 00jmpE9 00 00 00 00push6A .
2021-06-10 21:28:20
465
3
原创 对于硬编码的理解(水)
在最近的学习过程中,了解到了硬编码这一个名词,于是就去百度了一下,从字面意思上来看,我对硬编码的理解就是一种类似于编程语言的东西,但百度过后发现好像每一篇文章对硬编码的讲解都不大一样,搞得我一脸懵逼,于是就来总结一下各篇文章的讲解。首先我们看一下百度百科的结果:硬编码是将数据直接嵌入到程序或其他可执行对象的源代码中的软件开发实践,与从外部获取数据或在运行时生成数据不同。硬编码数据通常只能通过编辑源代码和重新编译可执行文件来修改,尽管可以使用调试器或十六进制编辑器在内存或磁盘上进行更改。硬编码的数据通
2021-06-08 16:56:37
1370
2
原创 pe文件对齐
内存对齐与文件对齐一个pe文件无论在磁盘和内存中存放都会进行对齐,但他们的对齐值会不相同。PE 文件头里边的FileAligment 定义了磁盘区块的对齐值。每一个区块从对齐值的倍数的偏移位置开始存放。而区块的实际代码或数据的大小不一定刚好是这么多,所以在多余的地方一般以00h 来填充,这就是区块间的间隙。PE 文件头里边的SectionAligment 定义了内存中区块的对齐值。PE 文件被映射到内存中时,区块总是至少从一个页边界开始。rva与fov的相互转换RVA与FOV的相互转换为.
2021-06-08 13:29:57
3983
TA创建的收藏夹 TA关注的收藏夹
TA关注的人