old.liveoverflow.com/binary_hacking/protostar/stack0.html
Stack 0 - LiveOverflow
Bruteforcing stack canary, stack guard, stack cookie with a C program.
old.liveoverflow.com
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
int main(int argc, char **argv)
{
volatile int modified;
char buffer[64];
modified = 0;
gets(buffer);
if(modified != 0) {
printf("you have changed the 'modified' variable\n");
} else {
printf("Try again?\n");
}
}
먼저 소스 코드를 확인해보면 4byte modified 변수와 64byte 버퍼가 존재한다. 또한 buffer을 입력받고, modified의 값이 0이 아니면 (값이 변조되면) 값이 변경되었다고 출력된다.
위의 이미지는 gdb로 살펴본 코드이다. 이 코드에 따라 스택을 정리하면 아래의 이미지와 같다.
~ebp, esp 정리~
<main+1>: ebp를 esp로 옮긴다. (ebp=esp)
<main+3>: esp에 0xfffffff0을 and 연산한다. 이 연산을 진행하면 esp=ebp+8이 된다. 따라서 ebp와 esp 사이에 8byte의 간격이 생긴다.
<main+6>: esp에서 0x60을 빼준다. 이 공간은 main 함수에서 사용하게 된다.
buffer과 modified 사이에는 0x44-0x4=0x40(10진수로 64)byte가 존재한다. 따라서 65byte 이상을 입력하게 되면 modified 값이 변경되어 문제를 해결할 수 있다.
728x90
'CTF > 시스템' 카테고리의 다른 글
protostar stack2 (0) | 2020.10.29 |
---|---|
protostar stack1 (0) | 2020.10.29 |
해커스쿨 FTZ level18 (0) | 2020.10.29 |
해커스쿨 FTZ level17 (0) | 2020.09.29 |
해커스쿨 FTZ level16 (0) | 2020.09.24 |