Как получить доступ к переменной в основной функции в C с помощью сборки x86

0

Это моя основная функция

    #include<stdio.h>
    #include<stdlib.h>
    int name1(int g);
    char* getStringFromC(void);
    int main(){

int a=2;
char* g="this is called from assembly";
printf("%d\n",name1(a));
return 0;
    }

    .text
    .globl name1
  name1:
    push %ebp
    movl %esp, %ebp      
    movl 8(%ebp),%eax      
    movl %ebp,%esp
    popl %ebp
    ret//This function name1(int a) in assembly

Проблема в том, как получить доступ к сборке? Я, хотя был 12 (% ebp) или 16 (% ebp), должен содержать те значения, которые похожи на char * g и т.д.

  • 0
    Что именно вы хотите с этим делать? Если вы не используете его в своем C-коде, оптимизирующий компилятор не включит его в объектный файл.
  • 0
    Какое отношение имеет getStringFromC ?
Показать ещё 3 комментария
Теги:
assembly
x86

2 ответа

1

В приведенном ниже примере делается то, что вам кажется нужным, а также показано, как получить доступ к глобальной переменной. Это работает на моей системе Ubuntu 13.10 x64. Как отмечает Medinoc и hvd, просмотр стека в том виде, который вы пытаетесь сделать, не является надежным.

Makefile:

CFLAGS=-Wall -Wextra

all: main

main: main.o lib.o

main.c:

#include <stdio.h>

void* stack_peek(int g);
void* get_global_str(void);

char const *global_str="Global";

int main(){
  int a=2;
  char const * g="this is called from assembly";
  printf("stack_peek(a): %p\n",stack_peek(a));
  printf("g: %p\n",(void*)g);
  printf("global_str: %p\n",(void*)global_str);
  printf("get_global_str(): %p\n",(void*)get_global_str());
  return 0;
}

lib.s:

.text

.globl global_str
.type global_str, @common

.globl stack_peek
.type stack_peek, @function
stack_peek:
  pushq %rbp
  movq %rsp, %rbp      
  movq 24(%rbp),%rax
  movq %rbp,%rsp
  popq %rbp
  ret

.globl get_global_str
.type get_global_str, @function
get_global_str:
  movq global_str,%rax
  ret

Вывод:

$ make -B
cc -Wall -Wextra   -c -o main.o main.c
as   -o lib.o lib.s
cc   main.o lib.o   -o main
$ ./main 
stack_peek(a): 0x40067b
g: 0x40067b
global_str: 0x400674
get_global_str(): 0x400674
1

Ты не должен. Если он не был включен как параметр и не является глобальным, вы не должны пытаться получить к нему доступ.

Но, ради полноты, я все равно отвечу: используйте указатель рамки. %ebp указывает на его предыдущее значение. Скопируйте его в регистр царапин, и вы можете проиндексировать локальные переменные вызывающего абонента через него.

  • 2
    Что заставляет вас говорить, что переменная g вообще существует в скомпилированной программе? Если компилятор видит, что g полностью не используется, компилятор почти наверняка оптимизирует его, и никакое отслеживание кадров не приведет вас к тому, что больше не существует.
  • 0
    На самом деле. Кроме того, вы не знаете, была ли ваша функция вызвана main (). Или использует ли вызывающая сторона оптимизацию «пропустить указатель кадра». Так много вещей, которые могут пойти не так, так мало времени ...
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню