본문 바로가기

전체 글

(87)
[드림핵/워게임] rev-basic-2 https://dreamhack.io/wargame/challenges/16/ 문제는 앞선 문제들과 똑같으니 IDA 코드를 살펴 보자 다른 코드들은 모두 똑같으니 빠르게 sub_140001000 함수부터 보겠다. 0x12번 반복하므로 입력 문자열의 길이는 18이라는 것을 추측할 수 있다. aC에서 4바이트씩 증가하며 입력 문자열과 비교한다. → aC에 무엇이 저장되어 있는지 살펴 보면 된다. 배열의 형태로 문자들이 저장되어 있는 것을 볼 수 있다. 이를 다 이어 붙이면 Comp4re_the_arr4y가 나온다. 입력으로 넣어 주니 Correct가 잘 뜨는 모습이다.
[드림핵/워게임] rev-basic-1 https://dreamhack.io/wargame/challenges/15/ 문제 파일을 받으면 이렇게 실행 파일이 존재한다. 터미널에서 실행해 보면 rev-basic-0과 똑같이 입력, 출력이 이루어진다. IDA로 열어 보자!! 전체적인 코드는 똑같으므로 설명을 생략하겠다 sub_140001000 를 보면 1바이트 단위로 값을 비교하는 것을 볼 수 있다. 각 인덱스 값이 모두 같으면 Correct를 출력한다. 숫자를 문자로 변환하는 단축키 R을 이용해 모두 변환해 보겠다. 결론적으로 입력되어야 하는 문자열은 Compar3_the_ch4ract3r이다 성공적으로 Correct가 뜬 걸 볼 수 있다.
[드림핵/워게임] rev-basic-0 https://dreamhack.io/wargame/challenges/14/ 문제 파일을 받으면 이렇게 실행 파일이 존재한다. 터미널에서 실행해 보면 사용자의 입력을 받고 Wrong을 출력하는 걸 볼 수 있다. IDA로 열어 보자!! 강의를 보긴 했지만 처음 해 보는 거라 막막하기만 하다… 우선 사용자의 입력으로 인해 correct, wrong 이 결정되고 출력되므로 단축키 Shift + F12를 사용해 correct 문자열을 찾아 보자!! Ctrl+F를 통해 correct를 찾아 주고 더블 클릭해 주면 아래와 같은 화면이 뜬다. View → Open Subviews → Cross References 를 누르면 이 문자열이 참조되는 함수를 볼 수 있다. 사실상 위의 사진에서도 correct는 main+..
[포너블/pwnable.kr] input input2@pwnable:~$ ls flag input input.c ls로 파일을 열어 보면 3개의 파일이 보인다. cat으로 열어 본 input.c는 다음과 같다. #include #include #include #include #include int main(int argc, char* argv[], char* envp[]){ printf("Welcome to pwnable.kr\n"); printf("Let's see if you know how to give input to program\n"); printf("Just give me correct inputs then you will get the flag :)\n"); // argv if(argc != 100) return 0; if(str..
[포너블/pwnable.kr] shellshock #include int main(){ setresuid(getegid(), getegid(), getegid()); setresgid(getegid(), getegid(), getegid()); system("/home/shellshock/bash -c 'echo shock_me'"); return 0; } setresuid, setresgid를 shellshock_pwn의 권한으로 부여 /home/shellshock/bash를 실행하고 echo shock_me 이 문제는 참… 처음 딱 보면 뭐 어쩌라는 건지 shellshock은 또 뭐고 뭐 진짜 어쩌라는 거임 이런 생각이 딱 들고 아예 아무 생각도 못하게 된다. 그래서 다른 라업들을 참고한 결과 shellshock, 환경변수, bash에 대해 좀 더 ..
[백준/c++] BOJ 14889 - 스타트와 링크 https://www.acmicpc.net/problem/14889 14889번: 스타트와 링크 예제 2의 경우에 (1, 3, 6), (2, 4, 5)로 팀을 나누면 되고, 예제 3의 경우에는 (1, 2, 4, 5), (3, 6, 7, 8)로 팀을 나누면 된다. www.acmicpc.net 문제 설명 N명의 사람을 N/2명씩 나누어 두 팀을 구성한다. 능력치 표가 주어지며, Sij는 i번 사람과 j번 사람이 같은 팀에 속했을 때, 팀에 더해지는 능력치이다. 두 팀의 능력치의 차이의 최솟값을 출력해라. N(4 > arr[i][j]; } solve(0, 0); cout
[포너블/pwnable.kr] blukat blukat@pwnable:~$ ls blukat blukat.c password #include #include #include #include char flag[100]; char password[100]; char* key = "3\rG[S/%\x1c\x1d#0?\rIS\x0f\x1c\x1d\x18;,4\x1b\x00\x1bp;5\x0b\x1b\x08\x45+"; void calc_flag(char* s){ int i; for(i=0; i
[포너블/pwnable.kr] cmd2 #include #include int filter(char* cmd){ int r=0; r += strstr(cmd, "=")!=0; r += strstr(cmd, "PATH")!=0; r += strstr(cmd, "export")!=0; r += strstr(cmd, "/")!=0; r += strstr(cmd, "`")!=0; r += strstr(cmd, "flag")!=0; return r; } extern char** environ; void delete_env(){ char** p; for(p=environ; *p; p++) memset(*p, 0, strlen(*p)); } int main(int argc, char* argv[], char** envp){ delete_env(); put..