반응형
[Protostar] Stack1
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
int main(int argc, char **argv)
{
volatile int modified;
char buffer[64];
if(argc == 1) {
errx(1, "please specify an argument\n");
}
modified = 0;
strcpy(buffer, argv[1]);
if(modified == 0x61626364) {
printf("you have correctly got the variable to the right value\n");
} else {
printf("Try again, you got 0x%08x\n", modified);
}
}
1. argc == 1 일때 에러가나는 것을 통해서 main함수에 인자를 주어야 한다.
2. strcpy(buffer, argv[1]); 에서 buffer의 크기는 64bytes이지만, argv[1]의 길이는 제한을 주지 않는다.
👉 여기서 buffer overflow가 발생
3. 그리고 modified의 값이 0x61626364가 되야 한다.
* 참고로, 0x61 = a , 0x62 = b, 0x63 = c, 0x64 = d 이다.
더보기
추가로 stack1 파일을 gdb로 분석해보면,
modified와 buffer로 0x60이 할당되었고
strcpy전에 할당되는 것을 통해 buffer의 값이 esp+0x1c에 들어 있고,
cmp eax, 0x61626364로 비교되는 값인 modified의 값이 esp+0x5c에 들어 있는걸 확인 할수 있다.
우선, A로 64bytes를 채우면,
you got 0x00000000이라고 뜨면서 modified의 값이 나온다.
buffer 다음에 modified가 있기 때문에,
buffer 64bytes뒤에 값을 넣어주면 된다.
이때 값은 리틀 엔디안 형식(little-endian)으로 넣어주어야 한다.
0x61626364 👉 \x64\x63\x62\x61
그러면 성공!
문자열로 넣어도 된다.
문자열도 리틀 엔디안 형식으로 dcba로 넣어야 한다.
스택으로 그리면 아래와 같다.
페이로드 :
./stack1 `python -c 'print "A"*64+"\x64\x63\x62\x61"'`
또는
./stack1 `python -c 'print "A"*64+"dcba"'`
반응형