不知道是18年还是19年,当时搞web搞腻了,学了一个月二进制,pwn成功以后就搁下了。
当时的学习笔记,后续重新学习的时候再进一步完善

汇编语言:

段种类:.code、.data和堆栈(stack)

指令 英文全拼 翻译
MOV Move 传送
PUSH Push onto the stack 进栈
POP Pop from the stack 出栈
XCHG Exchange 交换



堆栈操作是以“后进先出”的方式进行数据操作。堆栈帧,啥关系

mov eax,dword ptr fs:[0] 的意思是把从FS:[0]处开始的双字数据传送给EAX

汇编语言基础

P39页码在上方 第一个汇编语言程序
main PROC
mov eax,5
add eax,6
INVOKE ExitProcess,0; 程序结束
main ENDP
P39 添加一个变量
.data 这个是数据区
sum DWORD 0 定义名为sum的变量。
DWORD是关键字,只限制大小写,不限制存放内容


.code 代码区
main PROC
mov eax,5
add eax,6
mov sum,eax
INVOKE ExitProcess,0
main ENDP


P46 整数加减法
.386 指明指令集.
.model flat,stdcall 程序工作模式,
flat为Windows程序使用内存的模式(代码和数据使用同一个4GB段),
stdcall为子程序的调用规范(32位windows服务要求使用stdcall),API调用时右边的参数先入栈
.stack 4096
ExitProcess PROTO, dwExitCode:DWORD


.code
main PROC
mov eax,5 汇编程序模板,再次增添代码即可
add eax,6


INVOKE ExitProcess,0
main ENDP

内部数据类型

类型(这里应该大写的) 用法
byte 8位无符号整数,B代表字节
sbyte 8位有符号整数,S代表字节
word 16位无符号整数
sword 16位有符号整数,
dword 32位无符号整数,D代表双(字)
sdword 32位无符号整数,SD代表有符号双(字)
fword 48位整数(保护模式中的远指针)
qword 64位证书,Q代表四(字)
tbyte 80位(10字节)整数,T代表10字节
real4 32位(4字节)IEEE短实数
real8 64位(8字节)IEEE长实数
real10 80位(10字节)IEEE扩展实数

二进制基础知识

push 123。push 数字 ,意义在于赋值,以及移动eax寄存器。

堆栈

老洞,了解一下

玩二进制所需要的知识

工具,了解一下

PE文件结构(数据节)

需要区分好下面的节

文件偏移地址:

数据指的是什么,文件开头又指的是什么
文件开头,指0x000?

难怪用减

0day书

1、 栈工作原理

函数调用完后,通过retn指令返回。retu指令会把这个返回地址弹入EIP寄存器。之后跳转到这个地址去执行。如果可以改变retn指令的返回地址,EIP执行的指令将被改变

工具篇

OD(加载程序,还可以直接附加进程)

OD快捷键

OD界面

破解Traceme(程序载入点,push ebp。但为啥不是那个固定的值呢)

注意这个函数!!!

破解Traceme3(OD使用教程那里,还没看的,可以把进度条拉到那里去看)

OD操作

OD入口查找(3个压栈操作,GetCommandLineA)

IDA

IDA桌面技巧

主窗口

右键可切换(文本视图+图表视图+距离视图)

查找函数(Alt+T、F5查看函数内容)

Hexview(修改数据用)

Export(输出函数)

Import(输入函数)

Name

Function

String

Struts

Enum

ESP(以下截图为计算平均值bug实验)

对数据添加监视

运行程序

地址计算

单步跟踪

快捷键

断点 F2
运行 F9
单步 F8
啥是硬件断点

视频例子

循环了二十次,问题所在

硬断点:

其他反汇编工具

写exe,尝试crack

https://jingyan.baidu.com/article/48b37f8dd5c0b01a6464883d.html
visual c++ 6.0 迷你版下载地址:https://dl.pconline.com.cn/download/803716-1.html

#include “stdio.h”
#include “string.h”
#define PASSWORD “1234567”

int verify_password(char *password){
int authenticated;
authenticated=strcmp(password,PASSWORD);
return authenticated;
}

main(){
int valid_flag=0;
char password[1024];
while(1){
printf(“please input password: “);
scanf(“%s”,password);
valid_flag = verify_password(password);
if(valid_flag){
printf(“incorrect password!\n\n”);
}
else{
printf(“Congratulation!\n”);
break;
}

}
}

写exe,尝试pwn(为何0123456不能绕过)

#include “stdio.h”
#include “string.h”
#define PASSWORD “1234567”

int verify_password(char *password){
int authenticated;
char buffer[8]; //add local buffer to be overflowed
authenticated = strcmp(password,PASSWORD);
strcpy(buffer,password);//over flowed here
return authenticated;
}

void main(){
int valid_flag=0;
char password[1024];
while(1){
printf(“please input password: “);
scanf(“%s”,password);
valid_flag = verify_password(password);
if(valid_flag){
printf(“incorrect password!\n\n”);
}
else{
printf(“Congratulation!\n”);
break;
}
}
}
//反汇编分代码块,数据块。堆栈是数据块的。函数调用时,虽然涉及堆栈。但是在进栈出栈操作时,才会对栈进行操作。

尝试覆盖EIP溢出(filePwn)

#include “stdio.h”
#include “string.h”
#include “stdlib.h”
#define PASSWORD “1234567”

int verify_password(char password){
int authenticated;
char buffer[8]; //add local buffer to be overflowed
authenticated = strcmp(password,PASSWORD);
strcpy(buffer,password);//over flowed here
return authenticated;
}

void main(){
int valid_flag=0;
char password[1024];
FILE
fp;
if(!(fp=fopen(“filePwn.txt”,”rw+”)))
{
exit(0);
}

fscanf(fp, “%s”,password);
valid_flag = verify_password(password);
if(valid_flag){
printf(“incorrect password!\n\n”);
}
else{
printf(“Congratulation!\n”);
}
fclose(fp);
}
//filePwn.txt
//为什么要逆序输入呢?

字符串反转网站:http://www.5ixuexiwang.com/str/reverse.php



倒序之前:00401420
倒序之后:02410400(错)
倒序之后,应该是:20144000

代码分析技术

静态分析技术

挖0day可以用这些静态代码扫描技术

动态分析技术

Ollydbg小刀試牛(脱壳、看视频时间)

F7(单步步入)、f8(单步,相比f7应该更宏观,不进入函数。Php有没这种调试方法呢)、F4(下一行,直接运行到某位置)push ebp
脱壳,就是先把外面的那层壳,运行完。等到地址连续的时候,就可能是壳已经脱完了

他说源码,工具,资料。都会给官方

Fuzzing(fuo tion)

c/s

专用工具

Fuzzing DIY

FTP服务,有多少种应用程序

病毒分析

病毒分析工具

病毒分析知识

核心态和用户态

什么是代码节,为什么PE病毒只有代码节,就不能引入函数节

Hook是啥