我有两个汇编代码,如下所示
file:a.asm
section .text
global _start
_start: mov eax, 4
mov ebx, 1
mov ecx, mesg
mov edx, 10
int 0x80
mov eax, 1
int 0x80
mesg db "KingKong",0xa
Run Code Online (Sandbox Code Playgroud)
和另一个汇编代码
档案:b.asm
section .text
global _start
_start: jmp mesg
prgm: mov eax, 4
mov ebx, 1
pop ecx
mov edx, 10
int 0x80
mov eax,1
int 0x80
mesg: call prgm
db "KingKong",0xa
Run Code Online (Sandbox Code Playgroud)
在获取这两个代码的十六进制并将其放入此C包装器之后
char *b = "\xb8\x04\x00\x00\x00\xbb\x01\x00\x00\x00\xb9\x7d\x80\x04\x08\xba\x0a\x00\x00\x00\xcd\x80\xb8\x01\x00\x00\x00\xcd\x80\x4b\x69\x6e\x67\x4b\x6f\x6e\x67\x0a";
char *b = "\xe9\x19\x00\x00\x00\xb8\x04\x00\x00\x00\xbb\x01\x00\x00\x00\x59\xba\x0a\x00\x00\x00\xcd\x80\xb8\x01\x00\x00\x00\xcd\x80\xe8\xe2\xff\xff\xff\x4b\x69\x6e\x67\x4b\x6f\x6e\x67\x0a";
int main()
{
(*(int (*)(void))a)();
}
Run Code Online (Sandbox Code Playgroud)
第一个汇编代码(b)按预期打印'KingKong',但第二个汇编代码a …
我正在进行linux汇编编程,过去几天我已经开始学习windows汇编编程.我ml用作汇编程序和golink链接器.我有汇编代码并从中获得了我的汇编代码exe.现在我需要恢复它的十六进制\xff\xab\x55等等.在linux中我使用objdump -d elf_executable或xxd -i file.它的窗户相当于什么?
编辑
我需要提一下,在Windows上使用objdump我收到以下错误
C:\Arena>objdump -d a.exe
objdump: a.exe: File format not recognized
Run Code Online (Sandbox Code Playgroud)
用它编译后
C:\Arena>ml a.asm
Microsoft (R) Macro Assembler Version 10.00.30319.01
Copyright (C) Microsoft Corporation. All rights reserved.
Assembling: a.asm
C:\Arena>golink a.obj kernel32.dll user32.dll
GoLink.Exe Version 0.26.14 - Copyright Jeremy Gordon 2002/9 - JG@JGnet.co.uk
Output file: a.exe
Format: win32 size: 1,536 bytes
Run Code Online (Sandbox Code Playgroud) 我读到内联函数,在进行函数调用时,我们用函数定义的主体替换函数调用.
根据以上说明,用户何时不应该有任何函数调用inline.
如果是这种情况为什么我call在汇编代码中看到三条指令?
#include <iostream>
inline int add(int x, int y)
{
return x+ y;
}
int main()
{
add(8,9);
add(20,10);
add(100,233);
}
meow@vikkyhacks ~/Arena/c/temp $ g++ -c a.cpp
meow@vikkyhacks ~/Arena/c/temp $ objdump -M intel -d a.o
0000000000000000 <main>:
0: 55 push rbp
1: 48 89 e5 mov rbp,rsp
4: be 09 00 00 00 mov esi,0x9
9: bf 08 00 00 00 mov edi,0x8
e: e8 00 00 00 00 call 13 <main+0x13>
13: …Run Code Online (Sandbox Code Playgroud) 我有以下C程序
#include <stdio.h>
#include <sys/types.h>
#include <sys/shm.h>
#include <sys/ipc.h>
int main()
{
key_t shm_key;
int shm_flag,shm_id,shm_size;
void *shm_addr;
shm_key = ftok("/home/meow/Arena",22);
perror("SHMKEY");
shm_id = shmget(shm_key,sizeof(int)*20,IPC_CREAT);
perror("SHMGET");
shm_addr = shmat(shm_id,NULL,0);
perror("SHMAT");
}
Run Code Online (Sandbox Code Playgroud)
当没有root权限执行时
meow@darkArts ~/Arena/c $ gcc shm.c && ./a.out
SHMKEY: Success
SHMGET: Success
SHMAT: Permission denied
Run Code Online (Sandbox Code Playgroud)
当由root用户执行时,我得到以下消息
root@darkArts:/home/meow/Arena/c# gcc shm.c && ./a.out
SHMKEY: Success
SHMGET: Success
SHMAT: Success
Run Code Online (Sandbox Code Playgroud)
是否可以在没有root特权的情况下将共享内存绑定到我的地址空间?
shmid = shmget(key, SHMSZ, IPC_CREAT | 0666);和shmid = shmget(key, SHMSZ, IPC_CREAT | 0777);我得到
meow@darkArts ~/Arena/c $ …Run Code Online (Sandbox Code Playgroud) 我有一个简单的程序集程序
.text
.globl _start
_start:
movl $1, %eax
movl $1, %ebx
int $0x80
Run Code Online (Sandbox Code Playgroud)
我已经组装好了.我已将其内容转储如下
root@bt:~# objdump -d out
out: file format elf32-i386
Disassembly of section .text:
08048054 <_start>:
8048054: b8 01 00 00 00 mov $0x1,%eax
8048059: bb 01 00 00 00 mov $0x1,%ebx
804805e: cd 80 int $0x80
Run Code Online (Sandbox Code Playgroud)
现在我的问题是,如果只给出下面的机器代码,我能否找回助记符 \xb8\x01\x00\x00\x00\xbb\x01\x00\x00\x00\xcd\x80
我有关于维基百科的访问链接,但我无法清楚地了解访问链接是什么以及它们与任何功能的返回地址有何不同.有人可以简要解释一下访问链接是什么以及为什么在调用堆栈上需要它?
我有以下代码
void func(char c[]) {
c[1]= '@';
std::cout<<c<<"\n"
<<sizeof(c)<<"\n";
}
// Main 1
int main() {
char temp[6] = "pinta";
func(temp);
}
Run Code Online (Sandbox Code Playgroud)
如果我将主要功能更改为以下内容
//Main 2
int main()
{
func("pinta");
}
meow@vikkyhacks ~/Arena/c/LinkedList $ g++-4.8 scrap/test.cpp
scrap/test.cpp: In function ‘int main()’:
scrap/test.cpp:12:14: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
func("pinta");
^
Run Code Online (Sandbox Code Playgroud)
经过一些谷歌搜索,我了解到第二个main没有传递任何字符数组,而是通过一个read only string literal当击中c[1] = '@'抛出一个seg错误.
我的问题是
" 我如何避免使用在temp其中使用的变量Main 1并直接将字符数组传递给func它的参数? "
而重要的条件是允许编辑传入的字符数组func.
我看到有许多答案阻止我这样做 …