본문 바로가기
728x90

전체 글51

[포너블 기초] Out-Of-Bounds OOB(Out Of Bounds) OOB는 배열의 요소를 참조할 떄때, 인덱스 값이 음수이거나 배열의 길이를 벗어날 때 발생한다. 개발자가 인데긋의 범위에 대한 검사를 명시적으로 프로그래밍하지 않을 때 발생한다. 공격자가 인덱스의 값을 임으로 설정할 수 있다면, 배열의 주소로부터 특정 오프셋에 있는 메모리 값을 참조할 수 있다. 드림핵의 예제코드를 보면 win의 값이 31337이 되면 플래그가 출력되는 것을 볼 수 있다. 따라서 OOB를 이용해서 win을 31337로 덮어씌우면 될 것이다. win의 주소는 0x2c이고 buf배열의 요소의 크기는 4바이트 이므로 입력할 idx값을 0x2c/4 = 11이다. 11을 입력하면 플래그가 출력된다. 2023. 11. 19.
[포너블 기초] RTL RTL(Return to Library) RET을 공유 라이브러리 함수의 주소로 변경하여 해당 함수를 호출하는 기법 NX-bit 우회 가능(즉, 스택상에서 실행권한이 없을때 RTL사용) RTL Chaining RTL기법을 체이닝하여 원하는 함수를 여러개 호출하는 기법 RTL Chaining - x86 RET에 호출할 함수를 넣고, pop ret로 이전함수의 인자를 정리후, fun1()에서 사용할 인자를 전달 여기서 pop pop ret은 32bit 환경에서 함수호출 규약때문에 넣어주는 부분 호출할 함수의 인자 개수만큼 pop을 넣어준다 이런식으로 계속해서 ret에 다음에 실행시킬 함수를 체이닝하는 것이 RTL Chaining이다. RTL Chaining - x64 x64에서는 함수 호출규약이 x86과 다.. 2023. 11. 12.
[포너블 기초] GOT Overwrite, RTL Chaining GOT Overwrite GOT(Global offset table) 엔트리에 임의의 값을 오버라이트(Overwrite)하여 실행 흐름을 변조하는 공격 기법 간단한 실습 #include int main() { puts("Resolving address of 'puts'."); puts("Get address from GOT"); } puts@plt를 호출하는 지점에 bp 설정 _dl_runtime_resolve_xsavec 함수에서 puts의 주소를 GOT엔트리에 씀 GOT에 puts의 주소인 0x7ffff7e02ed0이 쓰인 것을 볼 수 있음 두 번째 puts함수의 호출 부터는 바로 puts가 실행 시스템 해킹의 관점에서 보면 PLT에서 GOT를 참조하여실행 흐름을 옮길 때, GOT의 값을 검증하지 않.. 2023. 11. 12.
[포너블 기초]Shell Craft, Lazy Binding Shell Craft shellcraft는 pwntools에서 제공하는 간단하게 셸코드를 만들어주는 강력한 도구이다. 기본적인 문법은 shellcraft [환경].[OS].[syscall 함수](함수 인자) 이다. 소스코드 맨위에 context(arch='i386', os='linux') or context(arch='amd64', os='linux’ 를 넣어주면 shellcraft.[syscall함수](함수 인자) 이렇게 사용가능하다. http://docs.pwntools.com/en/stable/shellcraft/i386.html - i386 http://docs.pwntools.com/en/stable/shellcraft/amd64.html - amd64 위의 링크에서 추가적인 사용법을 확인 할 .. 2023. 10. 25.
[포너블 기초] Egg Shell, NX-Bit Egg Shell EggShell이란? 스택내에 셸코드 저장 불가 시, 환경변수 내에 셸코드를 저장 후, 환경변수의 주소 값으로 eip를 이동시켜 셸 코드를 실행하는 기법이다. export 변수명=`python -c 'print "\x90"*100+"셸코드“ 를 통해 환경변수에 셸코드를 저장한 이후 c언어의 getenv 함수를 이용하여 환경변수가 저장된 주소를 얻을 수 있고, RET주소에 getenv 함수를 통해 얻은 주소를 덮어씌우면 셸코드를 실행 할 수 있다. Nop Sled NOP은 어셈블리 명령어로, 아무것도 하지 않는 No Operation의 약자이다. NOP Sled를 직역하면 NOP 썰매로, 이는 NOP을 타고 쭉 미끄러져 셸코드까지 도달하는 것을 말한다. 원래의 NOP 역할은 기계어 코드가.. 2023. 10. 23.
[포너블 기초] Shell Code 만들기 Shell Code 만들기 전체적이 과정은 아래와 같다. 1.C언어로 해당 코드를 구현한다. 2.gdb로 역어셈블링하여 필요한 부분을 찾는다. 3.필요한 부분만 뽑아 어셈블리어로 새로 구현한다. 4.컴파일한 후, objdump로 기계어를 출력한다. 5.출력된 기계어들을 하나로 연결 시킨다. execve() 함수를 이용하여 shell code를 실행시키는 코드를 c언어로 작성해보겠다. * execve 함수는 현재 실행 중인 프로세스를 새로운 프로세스로 덮어쓴다. 아래는 execve()를 이용해서/bin/sh 셸을 얻게 해주는 셸 코드를 c언어로 작성 한 것이다. #include int main() { char*sh[]={"/bin/sh", 0}; execve(sh[0],&sh,0); } 이제 작성한 코드를.. 2023. 10. 23.