首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

二进制学习

xchg reg, mem/reg ; 交换两操作数内容 ; 两操作数中必须有一个在寄存器中 ; 操作数不能为段寄存器和立即数 ; 源和目的操作数类型要一致 shl opr, cnt ; 逻辑左移...动态分析 动态分析的目的在于定位关键代码后,在程序运行的过程中,借由输出信息(寄存器,内存变化,程序输出)等来验证自己的推断或是理解程序功能 主要方法有:调试,符号执行,污点分析 借用系统调用的跟踪工具看一下宏观动作...在 Linux 系统中,这种文件的后缀一般为 .o 。 可执行文件(Executable File),就是我们通常在 Linux 中执行的程序。...ida数据库 ctrl+s:选择某个数据段,直接进行跳转 ctrl+鼠标滚轮:能够调节流程视图的大小 x:对着某个函数、变量按该快捷键,可以查看它的交叉引用 g:直接跳转到某个地址 n:更改变量的名称...y:更改变量的类型 / :在反编译后伪代码的界面中写下注释 \:在反编译后伪代码的界面中隐藏/显示变量和函数的类型描述,有时候变量特别多的时候隐藏掉类型描述看起来会轻松很多 ;:在反汇编后的界面中写下注释

1K20

吃土记之GDB调试原理

gdb主要功能的实现依赖于一个系统函数ptrace,通过man手册可以了解到, ptrace可以让父进程观察和控制其子进程的检查、执行,改变其寄存器和内存的内容, 可以使程序员在程序运行的时候观察程序在内存.../寄存器中的使用情况 主要应用于打断点(也是gdb的主要功能)和打印系统调用轨迹。...在使用参数为PTRACE_TRACEME或PTRACE_ATTACH的ptrace系统调用建立调试关系之后,交付给 目标程序的任何信号(除SIGKILL之外)都将被gdb先行截获,gdb因此有机会对信号进行相应处...Linux实现系统调用的基本过程是: 应用程序准备参数,发出调用请求; C库封装函数引导。该函数在Linux提供的标准C库,即 glibc 中。...用户态 与 内核态 是独立的执行流, 因此在切换时,需要准备 执行栈 并保存 寄存器 。

1.1K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    GDB调试

    自定义程序运行方式 2. 让程序停止在你指定的位置:设置断点 3. 在停止点查看当前程序的状态:变量、寄存器的值 4....回车在GDB相当于重复上一个命令。 启动GDB运行程序 运行GDB调试a.out程序有以下几种方式: 方式一:直接运行gdb,然后在gdb中执行“file a.out”加载程序。...通过cd命令可以更改目录,pwd显示当前所在目录 准备就绪后就可以真正开始用GDB来调试程序了。...恢复执行: continue [ignore_count]:continue(c)命令恢复程序运行直到下一个断点或者结束,参数ignore_count是个数字,代表忽略之后的断点次数。...比如浮点寄存器 改变程序的运行 在用GDB不断调试的过程中,你慢慢已经掌握了程序的执行脉络,这时候你肯定希望按照自己的调试策略来改变程序的路径,有了这个能力,在调试中对程序就可以为所欲为,一次走完程序的所有路径

    2.2K10

    MIT 6.S081 (BOOK-RISCV-REV1)教材第四章内容 --Trap -- 中

    我们可以看到,用户代码sh.c初始了这一切: 在一个窗口执行make qemu-gdb命令启动xv6调试模式 在另一个窗口指令gdb-multiarch kernel/kernel命令,...我在寄存器拷贝的结束位置设置了一个断点,我们在gdb中让代码继续执行,现在我们停在了下面这条ld(load)指令。...这两个page table中其他所有的映射都是不同的,只有trampoline page的映射是一样的,因此我们在切换page table时,寻址的结果不会改变,我们实际上就可以继续在同一个代码序列中执行程序而不崩溃...既然我们已经运行在C代码中,接下来,我在gdb中输入tui enable打开对于C代码的展示: 我们现在在一个更加正常的世界中,我们正在运行C代码,应该会更容易理解。...在RISC-V中,存储在SEPC寄存器中的程序计数器,是用户程序中触发trap的指令的地址。但是当我们恢复用户程序时,我们希望在下一条指令恢复,也就是ecall之后的一条指令。

    41241

    c++中引用面试点7连问以及引用真的不分配内存吗

    ,只是被引用的变量多了一个别名而已,此时对引用求地址其实就是对被引用的变量求地址; 引用也会分配存储空间,用于保存被引用变量的地址,这一点在第7点中会进行说明; 基于以上原因,引用不可作为数组的元素。...什么时候需要使用常引用 当既要使用引用提高程序的效率,又不能在函数内部修改实参的值时,可使用常引用。...引用作为函数返回值有什么好处以及需要遵循什么规则 引用作为函数返回值的好处:在内存中不会产生被返回值的临时副本。...引用和多态的关系 引用是c++中另外一种实现多态的手段,与指针一样,也是基类的引用可指向派生类的实例。 7....rbp寄存器偏移8个位置的地方,其实就是把变量a的地址存入rbp寄存器偏移8个位置的地方 (gdb) 5 int *c = &a; => 0x000000000040056f <main

    57520

    攻击本地主机漏洞(中)

    注意,“return-to-libc”(Ret2libc)攻击是一种利用libc(C标准库)子例程中的缓冲区溢出漏洞劫持程序控制流的技术,该漏洞用于执行对执行有用的功能,例如进行系统调用。...下面的溢出程序将任意大小的argv变量保存到400字节的缓冲区中,并且在执行之前不会检查参数的实际大小。 1....让我们仔细看看出错期间的寄存器 (gdb) info registers 我们的有效负载向程序发送了足够多的A以写入RBP寄存器,导致程序跳转到内存中的0x414141414141....注:计算机通过寄存器管理堆栈。寄存器作为内存中的专用位置,在使用数据时存储数据。大多数寄存器临时存储用于处理的值。在堆栈中存储最后一个程序请求地址的小寄存器称为堆栈指针。...当您将程序附加到调试器时,它将改变寄存器,并且在调试器之外执行时,RSP的值将不同,这对于gdb之类的调试器来说是典型的。为了能够在调试器外部利用缓冲区溢出,我们需要确定RSP的实际位置。

    1.4K20

    MIT 6.S081 Lab Seven -- 多线程

    为了让您开始,您的xv6有两个文件: user/uthread.c和user/uthread_switch.S 以及一个规则:运行在Makefile中以构建uthread程序。...(gdb) b uthread.c:60 这将在uthread.c的第60行设置断点。断点可能会(也可能不会)在运行uthread之前触发。为什么会出现这种情况?...thread_switch 的开头,如下: (gdb) b thread_switch (gdb) c 您可以使用以下方法单步执行汇编指令: (gdb) si gdb的在线文档在这里。...ph运行两个基准程序。首先,它通过调用put()将许多键添加到哈希表中,并以每秒为单位打印puts的接收速率。之后它使用get()从哈希表中获取键。...在某些情况下,并发put()在哈希表中读取或写入的内存中没有重叠,因此不需要锁来相互保护。您能否更改ph.c以利用这种情况为某些put()获得并行加速?提示:每个散列桶加一个锁怎么样?

    33321

    int 3中断与软件调试

    摘要:平常编程调试的过程中,我们可能会有这样的疑惑:“为什么使用硬件模拟器,比如bochs调试的时候,开始设置的调试断点都不会生效?”,“断点调试的本质是什么,为什么程序能够在特定的地方停留下来?...既然程序是指令流,为何CPU没有一直执行下去?”,“在软件中断的情况下,如何进行调试?”。断点和单步执行是两个经常使用的调试功能,也是调试器的核心功能。...值得说明的是,在调试器下,我们是看不到动态替换到程序中的INT 3指令的。...在跳转到处理例程之前,CPU会保存当前的执行上下文,包括段寄存器、程序指针寄存器等内容。          ...注意:断点命中之后的中断服务程序是调试器来定义的,然后将服务入口注册到IDT中。

    2.5K20

    什么是Canary保护

    什么是Canary gdb指令复习 有无Canary呢就是在函数压栈的时候,函数刚开始执行的时候,它会多一个参数,也就是在ebp的上面,会压入一个Canary的值,在子函数验证完之后,对比Canary...gdb开始调试 补充的知识: 什么是堆栈内存对齐 and esp 0xfffffff0 主流编译器的编译规则规定“程序访问的地址必须向16字节对齐(被16整除)”内存对齐之后可以提高访问效率。...(gdb) until 或(gdb) u 指定程序直到退出当前循环体这里,发现需要把光标停止在循环的头部,然后输入u这样就自动执行全部的循环了。...(gdb) jump 5 跳转执行程序到第5行:这里,可以简写为"j 5"需要注意的是,跳转到第5行执行完毕之后,如果后面没有断点则继续执行,而并不是停在那里了。...16进制内容,如果有符号表会加载符号表 x/x $esp 查看esp寄存器中的值 x/s addr 查看addr处的字符串 x/b addr 查看addr处的字符 x/i addr 查看

    14310

    Linux之进程信号(下)

    这些寄存器在进程中具有特定的作用,例如寄存器的内容可以指向进程PCB、保存当前用户级页表,指向页表起始地址。寄存器中的CR3寄存器中存储的内容表示当前进程的运行级别:0表示内核态,3表示用户态。...5.如何支持gdb(调试) 这种直接快速进行调试的方式叫做事后调试,在gdb中上下文直接core-file core.xxx。...在main中和handler中,某函数被重复进入,程序会出现问题,则该函数称为不可重入函数; 在main中和handler中,某函数被重复进入,程序不会出现问题,则该函数称为可重入函数。...: 编译器认为quit在main执行流中只是被检测,没有被修改,编译器就对quit做了优化(将quit放入寄存器,这样后续就不用再去内存中读取quit,提高了程序运行效率)。...因此,虽然程序中修改了quit,但只是改变了内存中的quit,CPU的寄存器中保存的值不会一起改变,所以无论内存中的quit怎么改,寄存器中的quit一直不变一直为0。

    26020

    一个简单的基于 x86_64 堆栈的缓冲区溢出利用 gdb

    在堆栈的外部(在 x86 和 x86_64 上向下增长,这意味着随着内存地址变大,内存地址会下降),程序的其他部分被存储和操作。通常,我们进行黑客攻击的想法是按照我们认为合适的方式重定向程序流。...通常,您会希望获得特权,通常是通过执行 shellcode - 或者无论您的最终目标是什么,但出于本教程的目的,我们只会将程序流重定向到我们无法访问的代码(在实践,这几乎可以是任何事情;甚至包括执行未正式存在的指令...您需要 -ggdb 才能在 gdb 中看到 C 源文件,并且需要 -fno-stack-protector 以便堆栈粉碎保护不会编译到二进制文件中进行测试。...) p/x $rip $5 = 0x414141414141 (gdb) 现在程序已经运行,崩溃,并留下一些寄存器供 gdb 检查,你应该再次运行disas main,这次你的内存位置应该以 0x5555555...C 程序中的第 11 行对应于内存位置 0x000055555555519b。

    1.1K40

    结合实例深入理解C++对象的内存布局

    至此前面第一个问题有了答案,成员方法存储在进程的文本段,添加成员方法不会改变类实例对象的内存布局大小,它们也不占用对象实例的内存空间。 成员变量寻址 那么成员方法中又是如何拿到成员变量的地址呢?...这种约定目的是为了提高函数调用的效率,因为使用寄存器传递参数比使用栈更快。 而将寄存器上的参数又移动到栈上,是为了保证寄存器中的值不被覆盖。因为寄存器是有限的资源,在函数中可能会被多次用于不同的目的。...前面已经验证 private 成员变量也是根据偏移来找到内存位置的,我们可以在代码中直接根据偏移找到内存位置并更改里面的值。...地址空间布局随机化 前面的例子中,如果用 GDB 多次运行程序,对象的虚拟内存地址每次都一样,这是为什么呢?...(gdb) set disable-randomization off 之后再多次运行,这里的地址就会变化了。

    56421

    缓冲区溢出攻击初学者手册(更新版)

    这是因为在程序的基础上很容易出现这种问题,但是这对于不了解或是无法获得源代码的使用者来说是不可能的,很多的类似问题就会被利用。本文就的目的就是教会新手特别是C程序员,说明怎么利用这种溢出环境。...汇编命令PUSHL会增加栈的顶部,POPL会从栈的顶部移除项目并且把它们放到寄存器中。为了直接访问栈寄存器,在栈的顶部有栈顶指针ESP。...通常情况下,主函数要把EBP寄存器压入栈中,这是函数储存的和在结束后在储存的。这就是帧指针的概念,允许函数使用自己的偏移地址,在对付攻击时就变的很无趣了。因为函数将不会返回到原有的执行线程。...我们只需要知道栈是什么样的。在顶部,我们有函数的内部缓冲区和函数变量。在此之后,有保存的EBP寄存器(32位,4个字节),然后返回地址,是另外的4个字节。...在最低级的内存地址,ESP指向栈的顶部,初始变量被储存,即缓冲器中的zgv储存了HOME环境变量。在那之后,我们保存了EBP和前一个函数的返回地址。

    1.4K90

    C和C ++ IDE智能代码编辑器:CLion 2022 中文版「winmac」

    4、重构重命名符号,在层次结构中上/下移动成员,更改函数签名,并确保CLion的自动重构将在整个代码中准确传播适当的更改。 即时代码分析1、使用CLion,您可以同时创建美观且正确的代码。...立即识别潜在的代码问题......2、并在您输入时修复!确保CLion自动处理所有正确的更改。3、CLion还执行数据流分析,以找出无法访问的代码,无限递归等所有情况。 ...集成调试器通过CLion友好的调试器用户界面轻松调查和解决问题,GDB或LLDB作为后端提供。附加到本地进程或远程调试。在源不可用时检查反汇编视图。...1、内联变量视图在调试时,使用编辑器中显示的变量值获取项目的完整视图。2、表和变量视图检查堆栈帧中所选函数的所有变量的状态,或监视调试会话期间变量/表达式的变化。...在本地编辑代码后,在本地或远程构建,运行或调试应用程序或单元测试。

    1.5K20

    【Linux】进程信号(中)

    当代码除0时,程序运行后就崩溃了,程序运行变为进程,进程运行代码时出现了非法代码,进程退出了 ---- 将内存中的指令数据load到CPU中 状态寄存器中有比特位表示当前计算的状态 CPU中有的寄存器保存未来的计算结果...当干掉进程后,并没有发现以pid结尾的文件 说明使用Term类型的信号,干掉进程后,不发生核心转储 ---- 8号信号 Core,浮点数异常 在终端1中运行可执行程序,在终端2中发送8号信号干掉进程...会先进行核心转储,在终止进程 核心转储的作用 方便异常后,进行调试 为了让代码从release变为debug,所以在makefile中 加入 -g 如果不懂请看 : gdb调试器的使用 ----...C留的作业,即解除阻塞,写完作业即递达 ---- 5.阻塞和忽略是不同的,只要信号被阻塞就不会递达,而忽略是在递达之后的可选的一种处理工作 同样有一个老师,布置作业后,你记录下来了,可是这个老师平时不查作业...初始化sigset_t变量之后就可以在调用sigaddset和sigdelset在该信号集中添加或删除某种有效信号 sigprocmask 读取/更改进程的信号屏蔽字,即可以更改block这张位图 int

    21430

    跟踪分析Linux内核5.0系统调用处理过程

    二、挂载 menuOS 根文件系统首先是内核启动时所 mount(挂载)的第一个文件系统,内核代码映像文件保存在根文件系统中,而系统引导启动程序会在根文件系统挂载之后从中把一些基本的初始化脚本和服务等加载到内存中去运行...在menuOS中输入sync,调用我们写好的sync()函数,相应的在 gdb 调试中进入了系统函数sys_sync()的断点处,函数位于sync.c文件的 123~375 行。...在操作系统内核中维护着一个中断向量表(Interrupt Vector Table),这个数组存储了所有中断处理程序的地址,而中断号就是相应中断在中断向量表中的偏移量。系统调用表同理。...Linux 通过软中断实现从用户态到内核态的切换。用户态与内核态是独立的执行流,因此在切换时,需要准备执行栈并保存寄存器。...在 Linux 中,系统调用号一般通过 eax 寄存器来传递。

    1.4K20

    通过dlv简单分析Go coredump文件

    跟踪点 设置一个跟踪点,这个跟踪点也是一个断点,只不过运行时候不会断住程序,只是打印一行信息,这个命令在某些场景是很有用的,比如你断住程序就会影响逻辑(业务有超时),而你仅仅是想打印某个变量而已,那么用这种类型的断点就行...-a 可以显示更多的寄存器 控制打印字符串长度?...构建程序 go build -gcflags "-N -l" -o main main.go 和GDB 调试C/C++ 程序差不多,可以先参考:GDB 入门使用 断点设置 info breakpoints...查看 goroutines 查看 goroutines 信息 在使用前 ,需要注意先执行 source /usr/local/go/src/runtime/runtime-gdb.py (gdb) info...内存和寄存器 查看寄存器 (dlv) regs # 查看常用的寄存器 (dlv) regs -a # 查看所有的寄存器 参考资料 https://golang.org/doc/gdb https:/

    2.5K10

    Golang 汇编入门知识总结

    1.1 程序的编译过程 以 C 语言为例来说,从 hello.c 的源码文件到 hello 可执行文件,经过编译器处理,大致分为几个阶段: 编译器在不同的阶段会做不同的事情,但是有一步是可以确定的,那就是...程序与进程 源码经过编译之后,得到一个二进制的可执行文件。文件这两个字也就表明,目前得到的这个文件跟其他文件对比,除了是具有一定的格式(Linux 中是 ELF 格式,即:可运行可链接。...从某个层面来看,可以把程序分为静态程序、动态程序:静态程序:单纯的指具有一定格式的可执行二进制文件。动态程序:则是静态可执行程序文件被加载到内存之后的一种运行时模型(又称为进程)。...定义中的 pkgname 是可以省略的,(非想写也可以写上,不过写上 pkgname 的话,在重命名 package 之后还需要改代码,默认为"") 编译器会在链接期自动加上所属的包名称。...中点 · 比较特殊,是一个 unicode 的中点,该点在 mac 下的输入方法是 option+shift+9。在程序被链接之后,所有的中点·都会被替换为句号.

    2.6K40
    领券