문제 소스는 아래와 같다.
/* The Lord of the BOF : The Fellowship of the BOF - bugbear - RTL1 */ #include <stdio.h> #include <stdlib.h> main(int argc, char *argv[]) { char buffer[40]; int i; if(argc < 2){ printf("argv error\n"); exit(0); } if(argv[1][47] == '\xbf') { printf("stack betrayed you!!\n"); exit(0); } strcpy(buffer, argv[1]); printf("%s\n", buffer); }
이전 문제와 달리 strcpy함수를 사용한다. 그리고 이전에 풀었던 문제들과 다른점은 argv[1]에 넣은 RET가 0xbf------여야 한다는 조건이 있었으나 이번에는 \xbf가 아니여야 strcpy함수를 호출할 수 있다.
간단하게 RTL로 풀 수 있다.
RTL의 payload는 NOP[44]+system address[4]+NOP[4]+/bin/sh address 이다.
system 함수의 주소와 /bin/sh의 주소를 알기 위해 GDB에서 leave에 BP를 걸고 실행한 후 system 함수의 주소를 알아냈다.
마찬가지로 /bin/sh의 주소를 알아야하는데 이를 알아내는 C코드를 컴파일하여 실행했다. 소스는 아래와 같다.
컴파일한 후 실행하면 아래와같이 주소가 나온다.
필요한 값들을 알았으니 payload를 작성했다.
쉘이 따졌다.
'Wargame > lord of bufferoverflow' 카테고리의 다른 글
Lord of bufferoverflow giant (0) | 2017.08.26 |
---|---|
Lord of bufferoverflow bugbear (0) | 2017.08.22 |
Lord of bufferoverflow golem (0) | 2017.08.21 |
Lord of bufferoverflow skeleton (0) | 2017.08.21 |
Lord of bufferoverflow vampire (0) | 2017.08.18 |