문제 소스는 아래와 같다.
/*
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 |