basic_fsb
WriteUP
이번에 풀어볼 문제는 basic_fsb라는 문제이다 제목에서부터 유추 가능하듯 FSB(포맷 스트링 버그)를 이용한 문제이다. 해당 문제를 실행시켜보자 특정 문자를 입력받고 그대로 출력해준다 해당 문제에 적용되어있는 메모리 보호기법을 확인해보자 아무것도 적용되어있지 않다 일단 해당문제를 분석하기 위해 GDB를 통해 유추해보자 main함수에서는 특별한게 없어 보인다 call부분에서 호출되는 vuln함수를 살펴보면 fgets로 입력을받고 snprintf함수와 printf를 사용한다 해당 프로그램을 명확히 분석하기 위해 IDA를 사용 vuln함수를 살펴보면 fgtes함수를 통해 s변수에 1024바이트만큼 이력받고 snprintf함수를 통해 400u(1024바이트)만큼 입력받기 때문에 bof는 통하지 않는다 또한..
rtl_core
WriteUP
rtl_core 이번에 풀어본 문제는 hackCTF의 rtl_core다 이번 문제도 제목에서 유추 가능한 rtl을 이용한 문제이다 해당 프로그램을 일단 실행시켜보자 passcode라는것을 입력받게 되어 있다. 음.. 해당 문제는 아마 ASLR과 NX가 기본적으로 적용되어있을 거 같은데 일단 확인해보았다. 역시나 그렇듯 NX가 설정되어있다 ASLR도 설저되어 있을 것이다. 일단 해당 문제를 명확히 분석하기 위해 IDA를 통해 확인해보았다. 메인 함수를 살펴보면 check_passcode함수의 인자로 s를 전달하고 반환되는 값이 hashcode값과 같으면 특정 문자열을 출력하고 core함수를 실행시켜주고 그렇지 않을 경우 또 다른 문자열을 출력해준다 (확인해보니 성공과 실패 같은 문자열) 우선 hashcod..
RTL이란?
System/Tips
RTL이란 RET 즉 리턴주소에 함수 공유 라이브러리에 있는 함수들 execv(), system()등의 함수를 불러와 사용할 수 있는 방법이다. RTL방법은 NX메모리 보호기법을 우회할 수 있다. 여기서 NX란 쉽게 설명해서 권한을 없애는것 HEAP, STACK등 메모리상에서 쉘코드등을 이용한 공격코드를 실행하지 못하게 하는것이다. PAYLOAD는 dummy+(ret위치(system()))+dummy(4byte)+/bin/sh 같이 쓰인다. 함수와 인자값 사이에 더미가 들어가는것이 이상하게 느껴질 수 있다. 이는 32bit환경에서 함수가 호출될 때 인자 값을 가지고오기위해 ebp+0x8의 주소에서 가져오기 때문이다.그러기때문에 ebp+0x8위치에 /bin/sh를 넣는다.
rtl_world
WriteUP
HcakCTF rtl_world문제 이번 문제도 IDA를 안 쓰고 풀고 싶었지만 이번 문제는 IDA를 써서 풀게 됐다. 일단 해당 프로그램에 메모리 보호 기법이 어떻게 적용되어있는지 확인했다. NX가 걸려있는 걸 확인했다. 그렇다는 건 쉘 코드를 삽입해서 풀 수 없을 거 같다 그럼 시스템 함수를 실행시켜야 한다. 제목에 나와있듯이 RTL이라는 기법을 사용하여야 한다. 일단 프로그램이 어떻게 동작하는지 확인해보자. 해당 프로그램을 보면 2번을 통해 돈을 벌고 3,4번에서 시스템 함수와 빈 쉘의 문자열을 찾을 수 있고 5번을 통해 우리가 원하는 입력값을 받을 수 있다. 2번에서 4번은 히든 번호?로 수많은 돈을 획득할 수 있다 이것은 IDA를 통해 찾았다. 또한 프로그램에서 2,3번에 해당하는 시스템 함수의..
offset
WriteUP
HackCTF Offset 이번에 풀어볼 문제는 offset문제이다. 해당문제는 대부분 IDA라는 프로그램으로 쉽게 풀 수 있지만 한번 안쓰고 풀어보기로 하였다. 일단 해당 프로그램이 어떤 메모리보호기법이 적용되어있는지부터 확인하였다. 음.. 일단 NX가 활성화 되어있다 NX는 스택또는 힙등에서 쉘코드를 사용할 수 없도록 하는 보호 기법이다. 그렇다면 쉘코드를 직접적으로 삽입할 수 없는 거 같다. 일단 프로그램을 동작시켜보자 프로그램을 동작시킬 함수를 물어보고? 입력을받도록 되어있다. 일단 gdb로 까보자.. 음... select_func함수가 있고 32의 공간을 확보하고 함수 인자값으로 하나를 입력받는 거 같다. 해당 select_func를 확인해보자. strncpy함수를 이용해서 31바이트 만큼 eb..
메모리 보호 기법 해제
System/Tips
[ASLR 해제]sudo또는 root로1. sudo sysctl -w kernel.randomize_va_space=02. sysctl -w kernel.randomize_va_space=0 0 - 해제1 - 랜덤 스택 , 라이브러리2 - 랜덤 스택 , 라이브러리 , 힙 gcc 컴파일시에 메모리보호기법 해제gcc yncflag.c -fno-stack-protector -mpreferred-stack-boundary=2 -z execstack -no-pie -fno-pic -m32
/bin/sh 문자열을 찾는 소스코드
System/Tips
#include int main(int argc, char **argv) { long shell; shell = [system() 함수 주소] while (memcmp((void *)shell, "/bin/sh",8)) { shell++; } printf("\"/bin/sh\" : 0x%x\n", shell); printf("print %s\n", shell); return 0; } long타입 변수 shell을 선언 shell변수에 시스템함수의 주소를 대입 while문을 사용 memcmp함수를 사용하여 shell함수에 존해자는 "/bin/sh"라는 문자열을 null문자포함 8바이트를 비교하며 찾음
Simple_overflow_bof_ver_2
WriteUP
해당문제의 프로그램을 실행시켜보자 데이터를 입력받고 입력받은 데이터와 해당 데이터가 들어가있는 buf의 주소를 출력 해주며, 다시 입력할것인지 묻고 다시 입력을 받을 수 있다. 하지만 프로그램을 다시 시작하면 주소가 바뀌는걸로 봐서 이번문제도 ASLR기법이 적용되어 있는 거 같다. 다른것들도 적용되어있는지 확인해보자. 이번 문제도 ASLR을 제외한 메모리 보호기법은 적용되어있지 않는 거 같다. 이번 문제도 이전 문제와 비슷한 방식으로 풀면 될 거 같다. 일단 버퍼의 주소는 나와있으니 크기를 구해보자. 61번줄에서 data :를 입력받고 ebp-0x88위치의 주소를 eax에 넣고 인자값으로받아서 입력하는 거 같다 그렇다면 크기는 0x88(136)이 된다. 그렇다면 payload를 한번 작성해 보자. 해당 ..