Pwnable

Pwnable/LOB

[LOB] 18. NIGHTMARE

passcode : beg for me (NO DRAG, NO PASSCODE) 이번 문제에서는 상당히 제약이 많다. 라이브러리 함수도 사용할 수 없으며 버퍼도 이용할 수 없고, RET의 뒷부분은 물론이거니와 ret, leave 함수들도 사용할 수 없다. 대신에 fgets 함수로 입력을 받는다. 바로 이 부분을 이용하면 될 것 같다. fgets 와 같이 어떠한 값들을 입력받는 함수들을 이용할 때 메모리에는 이 입력받은 값들을 일시적으로 저장하는 임시 버퍼가 생성된다. 모든 함수들은 스택에 올라갈 때 인자부터 올라가게 되므로, gdb 로 분석해보면 fgets를 call 하기 전에 0x8049a3c, 즉 stdin 임시 버퍼의 주소를 올린다. 우선 적당한 위치에 bp를 걸어준다. 걸어줄 부분은 fgets 호..

Pwnable/LOB

[LOB] 17. SUCCUBUS

passcode : here to stay (NO DRAG, NO PASSCODE) 간단하게 PLT를 이용하여 푸는 문제이다. PLT에 관련된 내용은 RTL에서 다루었다. 간단히 말해서 함수를 호출할 때 우선 PLT를 참고하고, 이 PLT는 다시 GOT를 참고한다. 문제는 다음과 같은 알고리즘으로 해결한다. main 함수의 RET 값이 strcpy 함수의 주소로 덮인다. 또한 strcpy 함수의 RET 값이 “AAAA”로 덮이기 때문에 이를 strcpy 함수의 기능을 이용하여 shellcode의 주소로 덮는다. strcpy 함수를 이용하므로 인자의 개수 및 인자값을 잘 설정하여 argv[1]에 전달한다. strcpy(char *dest, char const source) 따라서 payload는 다음과 같..

Pwnable/LOB

[LOB] 16. ZOMBIE_ASSASSIN

passcode : no place to hide (NO DRAG, NO PASSCODE) RTL Chaining 애 관련된 문제인 것 같다. RTL Chaining은 기존의 RTL 기법에서 RET + 4 영역을 다음 실행할 함수의 주소로 덮는 방법이다. 이 방법을 연속으로 사용하게 되면 RTL Chaining이 되는 것이다. 여러개의 sub 함수가 존재하고 check 라는 변수의 값이 각 함수를 지나쳐가면서 변화된다. 우선 이 문제를 해결하기 위하여 필요한 조건은 다음과 같다. RET 부분에 DO 함수의 주소를 넣을 것 라이브러리 함수 이용 불가 MO 함수에 system 함수가 있으므로 RTL Chaining 으로 DO 함수에서 MO 함수까지 이동할 것 MO 함수의 인자로 “/bin/sh”를 전달해줄 ..

Pwnable/LOB

[LOB] 15. ASSASSIN

passcode : pushig me away (NO DRAG, NO PASSCODE) 이번 문제는 GIANT 문제의 코드와 비슷하지만 strncpy 함수를 통하여 딱 48바이트만 buffer를 채운다. 따라서 buffer + SFP + RET 이외의 공간은 사용할 수 없다. 그렇다면 buffer에 shellcode를 삽입하고 esp, ebp, eip 레지스터들을 잘 이용하여 쉘이 실행되도록 해야한다. 우선 buffer 안에 shellcode를 집어 넣을 것이므로 buffer는 NOP + shellcode 로 채워줘야겠다. 그리고 마지막에 eip가 buffer의 시작주소에 위치하여야 한다. main 함수의 기본적인 에필로그로는 eip가 buffer의 시작주소에 위치하지 못하기 때문에 에필로그를 한번 더 ..

Lucvs
'Pwnable' 카테고리의 글 목록 (6 Page)