小编vik*_*cks的帖子

为什么带有jmp指令的shellcode工作,为什么标签不能在C包装器内工作?

我有两个汇编代码,如下所示

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 …

x86 assembly machine-code shellcode

3
推荐指数
1
解决办法
857
查看次数

从exe文件中获取汇编级代码?

我正在进行linux汇编编程,过去几天我已经开始学习windows汇编编程.我ml用作汇编程序和golink链接器.我有汇编代码并从中获得了我的汇编代码exe.现在我需要恢复它的十六进制\xff\xab\x55等等.在linux中我使用objdump -d elf_executablexxd -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)

assembly

3
推荐指数
2
解决办法
6555
查看次数

为什么C++内联函数有调用指令?

我读到内联函数,在进行函数调用时,我们用函数定义的主体替换函数调用.

根据以上说明,用户何时不应该有任何函数调用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++ assembly inlining inline-functions

3
推荐指数
1
解决办法
842
查看次数

在没有root特权的情况下实现共享内存

我有以下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)

c linux ipc shared-memory

3
推荐指数
1
解决办法
4738
查看次数

有没有办法从机器代码中获取助记符?

我有一个简单的程序集程序

.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

assembly machine-code

2
推荐指数
1
解决办法
301
查看次数

堆栈帧上的访问链接是什么?

我有关于维基百科的访问链接,但我无法清楚地了解访问链接是什么以及它们与任何功能的返回地址有何不同.有人可以简要解释一下访问链接是什么以及为什么在调用堆栈上需要它?

c callstack

2
推荐指数
1
解决办法
626
查看次数

如何在没有任何临时char数组作为变量的情况下将字符数组传递给C++中的函数?

我有以下代码

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错误.

我的问题是

  1. " 我如何避免使用在temp其中使用的变量Main 1并直接将字符数组传递给func它的参数? "

  2. 而重要的条件是允许编辑传入的字符数组func.

编辑

我看到有许多答案阻止我这样做 …

c++ arrays string-literals

0
推荐指数
1
解决办法
1041
查看次数