自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

编程的本质是数学问题

学源码是最快的学习方法

  • 博客(20)
  • 收藏
  • 关注

原创 从寄存器看I386和x64位中函数调用中参数传递

x86_64基本使用寄存器存储函数参数,寄存器不够才入栈;而i386将所有参数保存在栈上,通过gcc的扩展功能__attribute__((regparm()))即可实现部分参数的寄存器传递。代码#include #include int v1 = 1;float v2 = 0.01;#ifdef FAST__attribute__((regparm(3))

2012-12-29 13:03:32 8902

原创 GDB查看栈信息

栈:是程序存放数据内存区域之一,特点是LIFO(后进先出)。PUSH:入栈POP:出战使用场景:1.保存动态分配的自动变量使用栈2.函数调用时,用栈传递函数参数,半寸返回地址,返回值代码sum.c#include #include #include #define MAX (1UL << 20)

2012-12-29 12:53:44 27335 2

原创 汇编语言系统调用过程

以printf为例,详细解析一个简单的printf调用里头,系统究竟做了什么,各寄存器究竟如何变化。如何在汇编调用glibc的函数?其实也很简单,根据c convention call的规则,参数反向压栈,call,然后结果保存在eax里头。注意,保存的是地址。在汇编里头,一切皆地址。当我们调用 result = printf( "%d %d", 12, a )的时候,编译器默

2012-12-29 12:42:22 3342

原创 GDB调试--以汇编语言为例

#rpm -qa |grep  gdb下载:安装#tar -zxvf #./configure#make使用GDB以汇编语言调试为例汇编语言实现CPUID指令CPUIDcpuid是Intel  Pentinum以上级CPU内置的一个指令(486级以下的CPU不支持),他用于识别某一类型的CPU,它能返回CPU级别,型号,CPU步进以及CPU字

2012-12-29 11:40:36 5216

原创 ATT格式汇编语言

1.编译与链接方法一:使用as#as -o test.o test.s#ld -o test test.o方法二:使用gcc#gcc -o test test.sgnu连接器查找_start标签以确定程序的开始,但gcc查找main标签,所以使用gcc要把 _start改为main2.调试#as -gstabs -o test.o test.s#ld

2012-12-29 13:17:23 2112

原创 C语言不要重复包含.h头文件和.c文件

本文首先向读者讲解了Linux下进程地址空间的布局以及进程堆栈帧的结构,然后在此基础上介绍了Linux下缓冲区溢出攻击的原理及对策。原理:从逻辑上讲进程的堆栈是由多个堆栈帧构成的,其中每个堆栈帧都对应一个函数调用。当函数调用发生时,新的堆栈帧被压入堆栈;当函数返回时,相应的堆栈帧从堆栈中弹出。尽管堆栈帧结构的引入为在高级语言中实现函数或过程这样的概念提供了直接的硬件支持,但是由于将函数

2012-12-29 13:16:28 2094 1

原创 汇编语言调用Linux系统调用

首先查找系统调用文件#find / -name unistd.h/root/linux/include/unistd.h/usr/include/linux/unistd.h/usr/include/sys/unistd.h/usr/include/bits/unistd.h/usr/include/unistd.h查看系统调用值/root/linux/incl

2012-12-29 13:15:47 1092

原创 从1的补码说起计算机的数制

字节换算bit(b)=位字节(byte)=8位 -128~127 0~255半字=2字节=16位 -32768~32767 0~65,535字(word)=4字节=32位 -2147483848~2147483647 0~4,294,967,295双字=8字节=64位 -9223372036854775808~9223372036854775807 0~18,446,744,0

2012-12-29 13:13:12 1444

原创 VirtualBox安装64位Linux

VirturlBox安装64位的Linux原因virtualbox 本身不带 64 位支持,它的 64 位支持依赖于通过cpu虚拟技术把cpu的64位指令直接映射过去。所以,要支持64位必须:1.你的cpu支持64位。2.你的cpu支持虚拟化,并且你的bios支持把cpu虚拟化功能开启。3.你的virtualbox是2.0以上(2.0以上才支持64位)。

2012-12-29 13:09:04 2171

原创 段地址和偏移地址

8086:关于物理地址=段地址*16+偏移首先我们知道8086中段地址是从能被10H整除的地址开始的,即地址最后一位都是0(16进制表示)。这样在设计CPU时就没有必要表示这个最后一个0了。例如FFFF[0]H,这个地址,假设段地址是FFFFH,那么它的偏移地址就是0000H了。 因为CPU在设计时去掉了一个16进制的0,所以要乘以10H(十进制的16)。8086CPU有20位地址总线

2012-12-29 13:06:37 34127 2

原创 unix环境汇编语言常用工具

汇编器MASM:微软的汇编器不支持unixNASM:unix环境下兼容微软平台GAS:GNU 的免费软件包,unix环境下最流行跨平台汇编器安装GNU汇编器检查binunitsRedHat#rpm -qa |grep binunitsDebian#dpkg -l|grep binunit下载地址:找最新的安装包下载安装#wget

2012-12-29 13:04:35 1102

原创 查看CPU是i386架构和x86_64架构

查看处理器是32位还是64位#cat /proc/cpuinfo检查flags行中有没有lm标记,lm是Long Mode的简写,表示支持64位模式。#getconf LONG_BIT输出:32#getconf WORD_BIT输出:3232位的系统中int类型和long类型一般都是4字节,64位的系统中int类型还是4字节的,但是long已变成了8字节inux

2012-12-29 12:55:30 3509

原创 Linux内存管理大图(第三稿)

网友画的还不错就转了,该作者一共画了3版v0.1v0.2v0.3原文地址:http://bbs.chinaunix.net/thread-2018659-1-1.html

2012-12-29 12:54:47 4497

原创 linux环境内存分配原理

generate-core-file可将调试中的进程生成内核转储文件gcore可以从命令行直接生成内核转储文件,该命令无需停止正运行的程序以获得内核转储文件(gdb) generate-core-fileSaved corefile core.2785(gdb) gcore 'ps'Saved corefile 'ps' --《未完》---

2012-12-29 12:50:17 3314

原创 GDB attach到进程

要调试守护进程等已经启动的进程或是调试陷于死循环的进程可以使用attach命令格式 attach pidC语言代码#include int main(void) { int marks[10]; int i; for(i=0;i<12;i++) { scanf("%d",&mar

2012-12-29 12:49:21 5550

原创 gcc使用总结

查看glibc版本#rpm -qa | grep glibcglibc-2.12-1.80.el6_3.6.x86_64glibc-headers-2.12-1.80.el6_3.6.x86_64glibc-devel-2.12-1.80.el6_3.6.x86_64glibc-common-2.12-1.80.el6_3.6.x86_64 或者#ldd  --vers

2012-12-29 12:45:50 2515

原创 汇编语言使用C库函数和Linux动态链接

使用printf代码#cpuid2.s -- Using C labrary calls .section .data output: .asciz "The processor Vender is '%s'\n".section .bss .lcomm buffer, 12 .section .text

2012-12-29 11:56:31 2305

原创 使用cat /proc/进程id/maps 查看进程内存映射

proc//maps查看进程的虚拟地址空间是如何使用的。该文件有6列,分别为:地址:库在进程里地址范围权限:虚拟内存的权限,r=读,w=写,x=,s=共享,p=私有;偏移量:库在进程里地址范围设备:映像文件的主设备号和次设备号;节点:映像文件的节点号;路径: 映像文件的路径每项都与一个vm_area_struct结构成员对应C语言代码#include

2012-12-29 11:49:20 20433 2

原创 Linux环境ddd安装与使用

ddd是一个优秀的调试器,安装ddd破费周折必须安装x开发环境1.下载http://ftp.gnu.org/gnu/ddd/,下载最新的ddd-3.3.12.tar.gz#wget http://ftp.gnu.org/gnu/ddd/ddd-3.3.12.tar.gz#tar zxvf ddd-3.3.12.tar.gz#cd ddd-3.3.12/2

2012-12-29 11:48:33 8646 1

原创 VirtualBox虚拟机安装RedHat7.3编译Linux0.01内核

引子由于需要编译linux0.01内核,而目前的linux版本太高需要降低gcc版本等等,需要做不少调整非常不方便。所以,直接安装RedHat7.3,这样就好编译linux0.01的内核了。但是,安装RedHat7.3需要注意一些问题。下载老版的RedHatRedHat7.3下载地址http://ftp.heanet.ie/pub/redhat-archiv

2012-12-29 11:38:16 2347

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除