프로그램 섹션 헤더 보는 명령어
System/Tips
readelf -s [파일명] - 해당 명령어로 해당 파일의 섹션값들을 보여줌
ASLR 적용시 우회법
System/Tips
ASLR이란 특점 프로그램에서 스택, 힙, 공유라이브러리들의 메모리 주소를 랜덤화 즉 실행시킬 때 마다 주소값이 바뀌게 하는 메모리 보호 기법이다. 해당 기법이 걸려있을 때 우회 방법은 대표적으로 아래의 2가지 방법이다. 1. "A" 또는 "\x90" 사용 - 더미값으로 불리며 프로그램에 아무런 영향을 끼치지 않고 eip를 다음 명령어로 넘김. 그러므로 버퍼안에 더미값을 충분히 채워놓은 후 뒤쪽에 쉘코드를 삽입하여 프로그램이 랜덤한 주소로 리턴하거나 점프해도 더미값 안에 eip가 떨어질 확률을 높히는 것 여러개의 더미값 중 한군데에만 떨어져도 eip는 더미값을 타고 끝까지 가서 쉘코드를 실행시키기 때문 하지만 버퍼의 크기가 작으면 대량의 더미값을 넣을 공간이 부족할 수 있음. 2. 반복 실행 - 더미값을..
[HackCTF] pwning
WriteUP
이번에 풀어볼 문제는 pwning라는 문제이다 제목으로는 어떤 문제인지 추측이 불가능하니 해당 문제를 우선 실행시켜보자. 높은 수를 입력하게 되면 크다고 하고 종료되고 작은 수를 넣으면 통과되어 한번 더 입력을 받도록 되어있다. 해당 프로그램의 메모리 보호기법을 확인해보자. NX가 걸려있다. 쉘코드작성은 불가능할 것이고, IDA를 통해 상세 확인을 해보도록 하자. MAIN함수에서는 특별한 걸 발견할 수 없었다 바로 vuln함수를 호출하는 듯하다 해당 함수를 확인해보자. nptr이라는 변수의 크기를 32로 지정해놓고 get_n이라는 사용자 정의함수로 nptr에 입력을 받는 듯하며 해당 입력값을 v2변수에 넣고 해당 변수가 32이상일 경우 크다는 내용 추려과 함께 종료되며, 그렇지 않을 경우 한번 더 입력받..
[pwnkr] - shellshock
WriteUP
해당 문제는 함께 제공되는 소스코드 또는 아래와 같다. 별 내용 없이 시스템 함수가 실행된다. 해당 문제를 해결하기위해서 사용한 방법은 2014년 발표된 bash의 취약점인 shellshock를 활용했다 shellshock란 환경변수에 함수를 저장하고 서브 쉘로 변경 시 함수 부분 뒤에 이어 나오는 문자열을 명령어로 인식하고, 필터링 없이 실행되는 취약점이다. 즉 아래와 같이 환경변수를 만든 후 shellshock함수에 존재하는 시스템 함수로 bash를 실행시켜 서브 쉘로 변경될 때 해당 함수 뒤에 나오는 명령어를 실행시켜 플래그를 획득할 수 있다. 해당 문제는 export가 아닌 env함수로도 해결할 수 있다. 위의 함수 제작에서 :은 1 즉 무조건 참임을 의미한다. 결론은 flag라는 환경변수에 함수..
[pwnkr] - mistake
WriteUP
해당 문제와 함께 제공되는 소스코드는 아래와 같다. 해당 코드를 살펴보면 해당 코드에서의 취약점은 개발자의 연산자 우선순위 선정 실패로 일어난다 첫 번째 if문을 보면 fd=open을 통해 password파일을 읽기 전용으로 0400 권한을 준 후 < 0으로 비교하는 거 같지만 연산자의 우선순위는 =연산자보다
[pwnkr] - input문제
WriteUP
해당 문제의 소스코드는 아래와 같다. 차례대로 stage 1번부터 아래와 같다. [stage 1] 스테이지 1번은 argc의 개수가 100개 여야 하며, argv ['A'], argv ['B'] 즉 65번과 66번째 argv에 각각 \x00과 \x20\x0a\x0d가 입력되면 통과한다. [stage 2] 스테이지 2번은 read를 사용하여 파일 디스크립터 0 표준 입력으로 \x00\x0a\x00\xff를 입력하고 그 후 다음 read를 사용하여 2 표준 에러에 \x00\x0a\x02\xff가 입력되면 통과된다. [stage 3] 스테이지 3번은 \xde\xad\xbe\xef라는 이름의 환경변수의 저장되어있는 값이 \xca\xfe\xba\xbe와 일치하면 통과이다. [stage 4] 스테이지 4번은 \x0..
[pwnkr] - random
WriteUP
해당 문제와 함께 제공되는 소스코드는 아래와 같다. 해당 내용을 보면 random 변수에 radn() 함수를 이용하여 나수를 저장하고 scanf를 사용하여 key변수에 입력을 받는 그 후 key값과 random값을 xor한 값이 0 xdeadbeef값과 같으면 플래그를 출력해준다. 해당 코드에서 취약점이라 할것은 rand함수이다 해당 함수는 난수를 생성해주지만 해당 매번 생성되는 난수의 값은 일정하다. 즉 한번 난수가 설정되면 그 값은 유지된다 만약 프로그램 실행 시 계속해서 바뀌는 진짜 난수 값을 설정하려면 rand(time(null))로 설정해주어야 한다. 이를 알아내기위해 gdb를 사용했다. rand함수의 실행결과는 eax에 저장되므로 eax는 rbp-0x4부분에 mov 시킨다. 이를 확인하기 위해..
[pwnkr] - passcode
WriteUP
해당 문제와 함께 제공되는 소스코드는 아래와 같다. welcome함수에서 이름을 입력받고 login함수에서 두 개의 패스코드를 입력받아 해당 조건문을 통과하면 플래그를 획득할 수 있다. 하지만 해당 두 정수를 입력하면 플래그가 출력되지 않는다 그 이유는 scanf의 함수 원형을 살펴보면 서식 문자 뒤에 변수를 입력할 때는 &함께 주소를 지정해줘야 한다 하지만 위의 코드대로 입력할세 passcode변수에는 쓰레기 값들이 들어가게 된다. 아래의 welcome함수에서는 문자 또는 문자열일 경우에는 해당 첫 번째 인덱스가 시작 주소를 가리키기 때문에 상관이 없다. 일단 해당문제를 분석하기 위해 gdb를 통해 두 함수를 살펴봤다. welcome함수에서는 해당 name변수에 입력을 받는 위치는 ebp-0x70 위치..