목록War Game (174)
tmxklab
1. 문제확인 nc ctf.j0n9hyun.xyz 3004 1) 접속 hi를 입력하면 Hello와 함께 출력되면서 종료 2) IDA(Pseudocode)확인 - main() scanf()를 통해 s변수에 입력의 제한없이 문자열을 받음 -> bof 취약점 존재 입력받은 s변수와 "Hello"출력 3) IDA(Pseudocode)확인 - callMeMaybe() main()에서 호출되지 않았으며 호출해야할 함수 2. 접근방법 1) 스택구조(main) 2) 결론 scanf()를 통해 ret의 주소를 callMeMaybe()의 시작주소로 변조 3. 풀이 1) callMeMaybe() 주소 확인 callMeMaybe() 주소 : 0x400606 2) 공격 코드 작성 from pwn import * # pwntoo..
1. 문제확인 nc ctf.j0n9hyun.xyz 3003 1) 접속 Name과 input값을 입력한 뒤 프로그램 종료 2) IDA(Pseudocode)확인 - main() read()를 사용하여 표준입력을 받아 name변수에 50bytes까지 저장 가능 gets()를 통해 표준입력으로 들어온 문자열을 s변수에 저장 gets()에 쓰인 s변수는 main()에서 선언되어 있지만 read()에 쓰인 name변수는 main()에서 찾을 수 없음 ssize_t read(int fd, void *buf, size_t len) - int fd : 파일디스크립터(0, 1, 2는 표준 입력, 표준 출력, 표준 에러) - void *buf : 데이터를 저장할 버퍼 - size_t len : 읽을 데이터 크기 char *..
1. 문제확인 nc ctf.j0n9hyun.xyz 3002 1) 접속 "hi"를 입력하면 출력 값으로 "hi"을 내보내고 프로그램은 더이상 실행되지 않음 2) IDA(Pseudocode)확인 - main() vuln()를 실행하고 종료 3) IDA(Pseudocode)확인 - flag() system() 실행 4) IDA(Pseudocode)확인 - vuln() fgets()를 통해 input값을 s변수에 저장한 뒤 snprintf()를 통해 s변수에 저장된 값을 format변수에 저장 이때, 1024bytes까지 사이즈의 범위를 제한했지만 포맷을 지정하지 않았음 -> FSB 취약점 존재 마지막으로 format변수에 저장된 값을 포맷 지정 없이 printf()를 통해 출력 -> FSB 취약점 존재 int..
1. 문제확인 nc ctf.j0n9hyun.xyz 3001 1) 접속 "hi"를 입력하면 출력 값으로 "하아아아아앙"(?)을 출력하고 프로그램은 더이상 실행안됨 2) IDA(Pseudocode)확인 - main() IDA의 hex-lay기능을 통해 디컴파일된 c언어 코드로 변환 char형 s변수는 [ebp-8Ch]이므로 ebp로부터 140bytes만큼 떨어져 있고 void형 v5함수 포인터 변수는 [ebp-Ch]이므로 ebp로부터 12bytes만큼 떨어져 있음 v5변수 선언 후에 sup()함수의 주소를 저장 fgets()로 133bytes만큼의 입력 값을 받음 v5()가 방금 지정한 함수 실행 3) IDA(Pseudocode)확인 - sup() s에 입력된 값을 화면에 출력함 4) IDA(Pseudoco..
1. 문제확인 nc ctf.j0n9hyun.xyz 3000 1) 접속 "hi"를 입력하면 출력 값으로 "[buf] : hi"와 [check] 0x4030201을 출력하고 프로그램은 더이상 실행안됨 2) IDA(Pseudocode)확인 - main() IDA의 hex-lay기능을 통해 디컴파일된 c언어 코드로 변환 char형 s변수는 [ebp-34h]이므로 ebp로부터 52bytes 떨어져 있고 int형 v5변수는 ebp로부터 12bytes떨어져 있음 v5변수 선언 후에 0x4030201로 초기화 fgets()로 45bytes만큼의 입력 값을 받아 printf()로 출력함 두 번째 if문에서 v5변수가 초기화시킨 값이 아닌 0xDEADBEEF로 변경되면 system()함수 실행 2. 접근방법 1) 스택 구..
1. 문제확인 1) 사용자 및 패스워드 : level19 / swimming in pink 2) 파일확인 3) hint 코드 설명 main() { char buf20]; gets(buf); printf("%s\n", buf); } gets()를 통해 buf에 사용자의 입력 값을 넣고 printf()로 출력시키는 단순한 코드 gets()로 인해 buf배열의 크기(20bytes)보다 더 큰 입력을 받을 수 있음 -> bof 취약점 존재 2. 접근방법 1) attackme 디버깅 : gets함수의 인자인 buf가 gets함수 호출하기전에 push하므로 [ebp-40]위치에 buf변수 존재 2) 스택구조 3) 결론 gets()를 통해 buf배열의 크기(20bytes)보다 더 큰 값을 받을 수 있음 RTL공격기법..
1. 문제확인 1) 사용자 및 패스워드 : level18 / why did you do it 2) 파일확인 3) hint 코드 설명 #include #include #include #include void shellout(void); int main() { char string[100]; // 사용자의 입력받은 문자열을 저장하는 배열 int check; int x=0; // 사용자의 입력을 1byte씩 저장하는 변수 int count=0; // string배열에서 인덱스 역할 fd_set fds; // 파일 디스크립터(fd)를 저장하는 구조체 변수 선언(배열 형태) printf("Enter your command: "); fflush(stdout); // 출력 버퍼를 비움 while(1) { // 밑에 ..
1. 문제확인 1) 사용자 및 패스워드 : level17 / king poetic 2) 파일확인 3) hint 코드 설명 #include void printit(){ printF("Hello there!\n"); } main() { int crap; void (*call)()=printit; char buf[20]; fgets(buf, 48, stdin); setreuid(3098, 3098); call(); } fgets()로 인해 buf[20bytes]배열의 크기보다 더 큰 입력을 받을 수 있음 -> bof 취약점 존재 Level16과 달리 shell()가 사라지고 printit()만 존재 2. 접근방법 1) attackme 디버깅 : [ebp-16]에 0x8048490(printit()의 시작 주소..
1. 문제확인 1) 사용자 및 패스워드 : level16 / about to cause mass 2) 파일확인 3) hint 코드 설명 #include // level17 쉘 권한 획득할 수 있는 함수 void shell(){ setreuid(3097, 3097); system("/bin/sh"); } void printit(){ printf("Hello there!\n"); } main() { int crap; void (*call)()=printit; // 함수 포인터call변수가 printit함수의 주소를 가리킴 char buf[20]; fgets(buf, 48, stdin); call(); // printit함수 호출 } shell()은 level17 쉘 권한을 획득할 수 있는 함수이며 print..
1. 문제확인 1) 사용자 및 패스워드 : level15 / guess what 2) 파일확인 3) hint 코드 설명 #include main() { int crap; int *check; char buf[20]; fgets(buf, 45, stdin); if(*check==0xdeadbeef) { setreuid(3096, 3096); system("/bin/sh"); } } Level14와 구조는 비슷하지만 check변수가 포인터 변수임 2. 접근방법 1) attackme 디버깅 level14와 달리 level15에서는 check가 포인터 변수로 사용하므로 바로 [ebp-16]과 0xdeadbeef랑 비교하는 것이 아니라 [ebp-16]의 값을 주소로 사용하여 한번 더 들어가게 됨 if문에 0xde..