System/Protostar
-
[Stack 7]System/Protostar 2018. 2. 10. 22:34
[Stack7 Code] [Stack7 실행]Stack6와 비슷한 코드지만, ret(EIP)가 0xb로 시작하면 예외처리에 걸리게 된다.따라서 0xb7로 시작하는 시스템함수로 변조하는 RTL공격은 불가능하다.그래서 이번에는 Chaining RTL공격으로 쉘을 따냈다. Chaining RTL공격은 ASLR이 걸려있지 않기때문에 가능하다.ASLR이 걸려있다면 ROP로 쉘을 따내야 할 것이다. [Chaining RTL]기본 개념은 RTL과 동일하다.우리가 RTL공격을 할 때 짠 페이로드를 한번 보자 #RTLPAYLOAD : python -c 'print "A"*68+"System( )"+"AAAA"+"/bin/sh" buf[64] SFP System( ) dummy"AAAA" /bin/sh여기서 dummy값이..
-
[Stack 6]System/Protostar 2018. 2. 10. 00:29
[Stack6 Code] [Stack6 실행]우선 프로그램을 실행하면 입력한 값을 그대로 출력해준다.gets( )에서 BOF취약점이 있으며, 이 점을 이용해서 RET를 변조할 수 있다.gets( ) 다음에 __builtin_return_address(0)함수로 리턴주소를 ret에 저장한다그 다음에 ret이 0xbf로 시작하면, 즉 스택와 동일한 주소면 종료하는 조건문이 있다.따라서 쉘코드로는 쉘을 따내지 못한다.그래서 RTL을 이용해서 쉘을 따냈다. [RTL]ReturnToLiblaryRET공간에 시스템 라이브러리 함수의 주소값을 넣어서함수가 끝나고 RET주소로 복귀할 때, 시스템 함수가 실행되도록 하는 것이다.자세한 설명 : [RTL이란?] 우선 RTL공격을 하려면 System라이브러리 주소와 /bin..
-
[Stack 4]System/Protostar 2018. 2. 2. 23:44
[Stack 4 Code] [Stack 4 실행] 코드는 buffer를 입력받고 끝난다.BOF를 일으켜 win()를 실행시키면 되는 문제같다.우선, A를 65개 넣어봤지만 아무 반응이 없다.gdb로 열어봐야겠다. ========================================================== 문제를 풀기 위해선 EIP레지스터를 알아야 했다. EIP란Instruction Pointer로다음 실행될 함수의 주소값을 가지고 있는 레지스터다. 따라서, EIP공간까지 BOF를 일으켜서 win()의 시작 주소값을 넣어주면 되는 문제다. [Stack4 main] gets함수가 호출되는 부분에 BP를 걸고 실행을 시킨 후AAAA를 입력해봤다. 보면 buffer의 주소값이 0xbffff760임을..
-
[Stack 3]System/Protostar 2018. 2. 2. 20:42
[Stack 3 Code] [Stack 3 실행] 64바이트 버퍼공간을 입력받는다.그 후, 포인터fp안에 있는 주소값을 출력하고 그 주소값으로 fp함수를 호출한다.따라서, BOF로 우리가 원하는 주소의 함수를 호출할 수 있게된다.여기선 win함수를 호출하면 된다.그럼 code flow successfully changed 라는 문자열이 출력된다. =========================================================== 동작 모습은 확인 했으니 gdb로 main함수를 열어봤다.①에서 fp를 0으로 초기화 시켜준다.②에서 buffer를 입력받는다.③에서 fp가 0인지 아닌지 판별 후④ je(jump equal) 결과가 0과 같으면 ④-2로 jump하고다르면, ④-1로 계속 ..
-
[Stack 2]System/Protostar 2018. 2. 1. 20:53
[Stack 2 Code] [Stack 2 실행] getenv함수로 환경변수 GREENIE값을 불러온 후strcpy함수로 버퍼에 복사하는 과정에서 BOF가 발생한다. 환경변수 GREENIE를 만든 후, AAAA를 넣어주고 실행을 하면 modified값을 출력한다.BOF를 일으켜 modified변수에 0x0d0a0d0a를 넣어주면 Success 문구를 출력할 수 있다. ======================================================= 우선 버퍼공간이 64바이트니까 A를 64개 채워주고 스택상황을 확인해보자 저 부분이 strcpy함수를 호출하는 부분이니까그 다음 주소인 0x080484e4에 BP를 걸고 실행을 한다. ESP를 확인해보면 41(A)이 64개 채워진 다음 스택공..
-
[Stack 1]System/Protostar 2018. 2. 1. 17:45
[Stack 1 Code] [Stack 1 실행] Stack 1에 AAAA값을 넘겨 실행하면Try again, you got 0x00000000 이라면서modified변수 안에 값을 16진수로 8자리 출력해준다.BOF를 일으켜 modified변수 값을 0x61626364(abcd)로 조작해주면you have correctly got the variable to the right value라는 Success 문자열이 출력될 것이다. ================================================================================================== BOF취약점이 있는 strcpy함수를 사용함을 알 수가 있다.따라서, 인자값을 넘겨줄 때 64바이트를..
-
[Stack 0]System/Protostar 2018. 2. 1. 17:20
[Stack 0 Code] [Stack 0 실행] 버퍼가 64바이트 공간을 갖고 있으며, BOF를 일으켜 modified의 변수값을 바꾸면 되는 문제다.modified의 변수값이 0이아닌 다른값으로 조작되면you have changed the 'modified' variable이라는 문자열을 출력한다. gets함수를 호출하는 주소에 BP를 걸고 실행시켜보자 그 후 A를 64개 입력하고 ESP를 보면 64개까지 A가 채워져있고 그뒤는 modified변수 공간이므로 0으로 초기화 되어있다. 따라서, 버퍼64개를 넘겨준 뒤 임의의 값을 하나 더 넘겨주면 BOF가 발생되어 modified변수의 값이 바뀔 것이다. 성공적으로 modified변수 값을 조작했다. 그 후, Success 문자열 you have cha..