버퍼 오버플로를 호출하려면 어떻게 해야 합니까?
버퍼 오버플로를 사용하여 명시적으로 함수를 호출하지 않고 호출하라는 숙제를 받았습니다.코드는 기본적으로 다음과 같습니다.
#include <stdio.h>
#include <stdlib.h>
void g()
{
printf("now inside g()!\n");
}
void f()
{
printf("now inside f()!\n");
// can only modify this section
// cant call g(), maybe use g (pointer to function)
}
int main (int argc, char *argv[])
{
f();
return 0;
}
어떻게 진행해야 할지 잘 모르겠지만요.프로그램 카운터의 반송 주소를 g()의 주소로 바로 진행되도록 변경할까 생각했는데, 접속 방법을 잘 모르겠어요.어쨌든 팁이 좋을 것 같습니다.
기본 개념은 함수의 반환 주소를 변경하여 함수가 반환되었을 때 새로운 해킹된 주소에서 계속 실행되도록 하는 것입니다.답변 중 하나에서 닐스가 한 것처럼, 메모리 조각(보통 배열)을 선언하고 반환 주소도 덮어쓰도록 오버플로할 수 있습니다.
여기서 주어진 프로그램들이 어떻게 작동하는지 제대로 이해하지 못한 채 무작정 수강하지 말 것을 권합니다.이 기사는 매우 잘 쓰여져 있으며 매우 유용합니다.
그것은 컴파일러에 의존하기 때문에 어떤 대답도 주어질 수 없습니다.
다음 코드는 gcc 4.4.1에 대해 당신이 원하는 것을 할 것입니다.최적화를 비활성화한 상태에서 컴파일(중요!)
#include <stdio.h>
#include <stdlib.h>
void g()
{
printf("now inside g()!\n");
}
void f()
{
int i;
void * buffer[1];
printf("now inside f()!\n");
// can only modify this section
// cant call g(), maybe use g (pointer to function)
// place the address of g all over the stack:
for (i=0; i<10; i++)
buffer[i] = (void*) g;
// and goodbye..
}
int main (int argc, char *argv[])
{
f();
return 0;
}
출력:
nils@doofnase:~$ gcc overflow.c
nils@doofnase:~$ ./a.out
now inside f()!
now inside g()!
now inside g()!
now inside g()!
now inside g()!
now inside g()!
now inside g()!
Segmentation fault
이것은 숙제이기 때문에 버퍼 오버플로가 실제로 어떻게 작동하는지 이해하자는 코드애딕트의 제안을 반영하고 싶습니다.
버퍼 오버플로 취약성 스매싱 더 스택 포 펀 앤 프로익 활용에 대한 우수한(조금 오래된 경우) 기사/튜터를 읽으며 기술을 배웠습니다.
이것을 시도해 보십시오.
void f()
{
void *x[1];
printf("now inside f()!\n");
// can only modify this section
// cant call g(), maybe use g (pointer to function)
x[-1]=&g;
}
또는 이것:
void f()
{
void *x[1];
printf("now inside f()!\n");
// can only modify this section
// cant call g(), maybe use g (pointer to function)
x[1]=&g;
}
이 솔루션이 오버플로 기법을 사용하여 함수의 반환 주소를 스택에 덮어쓰지는 않지만 여전히 원인이 됩니다.g()
전화를 받다f()
돌아오는 길에main()
수정만 해서f()
전화도 안하고g()
직접적으로.
기능 에필로그와 같은 인라인 어셈블리가 에 추가됩니다.f()
스택의 반환 주소 값을 다음과 같이 수정합니다.f()
를 통해 돌아올 것입니다.g()
.
#include <stdio.h>
void g()
{
printf("now inside g()!\n");
}
void f()
{
printf("now inside f()!\n");
// can only modify this section
// cant call g(), maybe use g (pointer to function)
/* x86 function epilogue-like inline assembly */
/* Causes f() to return to g() on its way back to main() */
asm(
"mov %%ebp,%%esp;"
"pop %%ebp;"
"push %0;"
"ret"
: /* no output registers */
: "r" (&g)
: "%ebp", "%esp"
);
}
int main (int argc, char *argv[])
{
f();
return 0;
}
이 코드가 어떻게 작동하는지 이해하면 버퍼 오버플로 기법의 기초를 이루는 특정 아키텍처에 대해 함수의 스택 프레임이 어떻게 설정되는지 더 잘 이해할 수 있습니다.
언급URL : https://stackoverflow.com/questions/2333909/how-can-i-invoke-buffer-overflow
'programing' 카테고리의 다른 글
load_plugin_text 도메인이 작동하지 않습니다. (0) | 2023.09.19 |
---|---|
Sticky 사이드바: 아래로 스크롤할 때는 아래로, 위로 스크롤할 때는 위로 붙습니다. (0) | 2023.09.19 |
AngularJS로 멀티파트 요청 (0) | 2023.09.19 |
MySQL 쿼리 함수에서 '정의되지 않음'을 반환하는 NodeJS (0) | 2023.09.19 |
대규모 SQL에서 MongoDB로의 전송? (0) | 2023.09.19 |