write-up(pwn)/G04T

    [G04T] Simple BOF 3

    [G04T] Simple BOF 3

    문제의 c 소스 코드입니다. ioManager라는 구조체가 생성됩니다. 문자형 배열 buf와 문자열 포인터를 인자로 가지는 함수 포인터 printer를 가지고 있습니다. vuln() 함수에서 ioManager 구조체 변수 io를 선언합니다. 무한루프 안에는 메뉴를 보여주는 printMenu() 함수가 실행되고 변수 choice에 양의 정수를 입력 받아 각 번호에 맞는 기능을 수행합니다. 1번 기능은 io의 buf에 적힌 문자열을 출력해줍니다. 2번 기능은 io의 buf에 문자열을 적을 수 있습니다. 그 외 나머지 값이 입력되면 무한루프를 빠져나갑니다. 보호 기법을 확인해줍니다. 카나리가 설정되어 있는 것 외에 특별한 건 설정되어 있지 않습니다. gdb로 vuln() 함수를 디스어셈블 해봅니다. 을 보면 ..

    [G04T] Simple FSB 3

    [G04T] Simple FSB 3

    문제의 c 소스 코드입니다. corruptMe에 0xdead를 저장하면 셸을 획득할 수 있습니다. 이전 FSB2 문제와 동일한 구조입니다. 0xdead를 10진수로 바꾸면 57005입니다. 익스플로잇 코드를 작성합니다. %57005c% 8$n----- 0x60104a 57005이 8번째 포맷 스트링 인자에 적힌 corruptMe 주소에 들어가면서 셸을 획득할 수 있게 됩니다. 플래그를 획득했습니다! 참고 https://ssongkit.tistory.com/146

    [G04T] Simple FSB 1

    [G04T] Simple FSB 1

    문제의 c 소스 코드입니다. flag를 출력하면 되는 문제입니다. 메인 함수를 디스어셈블 한 결과 flag는 0x601060에 있음을 알게 되었습니다. c 소스 코드 중 아래 두 문장이 FSB 취약점을 유발합니다. scanf("%lu",&n); printf(n); printf() 함수의 동작을 이해하면 풀 수 있는 문제입니다. 예를 들어 printf("%d %d %d",1,2,3); 라는 구문이 있다면 첫 번째 인자는 형식표현자이고 두 번째 인자부터 첫 번째 인자에 적힌 표현식들로 순서대로 전달됩니다. printf() 함수가 실행될 때 "%d %d %d" 문자열을 찾아서 저장되어 있는 주소(문자열의 시작 주소)로 값이 바뀝니다. 예를 들어 "%d %d %d"가 0x506050에 저장되어 있다면 print..

    [G04T] Simple FSB 2

    [G04T] Simple FSB 2

    문제의 c 소스 코드입니다. corruptMe에 0xff를 저장하면 win() 함수가 실행되서 셸을 획득할 수 있습니다. vuln() 함수를 디어셈블 해보면 corrupMe 변수의 주소가 0x404049임을 알 수 있습니다. ff는 10진수로 255이고 이는 %255c로 나타낼 수 있습니다. 드림핵의 강좌를 보면 printf() 함수의 포맷 스트링 인자의 순서가 나와 있습니다. %p를 통해 입력 값이 몇 번째 인자에서부터 들어가는 지를 확인해보면 6번째부터 들어가는 것을 확인할 수 있습니다. 페이로드를 8바이트 단위로 나눠서 작성하면 아래와 같이 됩니다. %255c%8$ nAAAAAAA 0x404049 여기서 주소는 리틀엔디안을 적용시켜줘야 합니다. 위 내용을 바탕으로 익스플로잇 코드를 작성해 줍니다. ..

    [G04T] Simple BOF 2

    [G04T] Simple BOF 2

    문제의 c 소스 코드입니다. strcpy() 함수는 길이를 정해주지 않아서 BOF 취약점이 있습니다. input으로 넣을 수 있는 길이가 buf의 크기보다 크므로 BOF 공격이 가능합니다. win() 함수의 주소를 ret로 바꿔주면 됩니다. checksec으로 보호 기법을 확인해줍니다. vuln() 함수를 디어셈블 해주면 buf의 주소로부터 rbp까지의 거리가 0x20임을 알 수 있습니다. 이전 문제인 bof1처럼 문제를 풀어주면 똑같이 EOF가 터집니다. (stack alignment가 깨져서 그렇습니다) win() 함수를 디스어셈블해서 보면 0x401231에 "/bin/sh"가 인자로 들어갑니다. 따라서 ret 주소를 0x401231으로 바꿔주면 win() 함수를 실행시켜 쉘을 획득할 수 있습니다. ..