Dreamhack Wargame(63)
-
image-storage 풀이
Image Storage Home List Upload 파일 업로드 맨 마지막 코드는 upload.php인데 사진으로 첨부하기엔 좀 길어서 코드 블록으로 첨부해봤습니다. upload 페이지에서 웹쉘 취약점이 터지는 형식 인 것 같습니다. upload.php에서 php 코드 부분을 보니 별다른 필터링은 하지 않고 있습니다. 문제에서 FLAG는 /flag.txt에 있다고 했으니까 경로로 이동해서 FLAG를 획득하도록 하는 php 코드를 작성하겠습니다.
2021.11.17 -
rev-basic-7 풀이
이번 문제는 주어진 배열의 길이도 짧고 다 좋은데, __ROL1__이라는 것이 코드에 있습니다. 아무래도 맥락상 알고리즘이나 암호화 같은데.... 구글링을 한 번 해보겠습니다. https://namu.wiki/w/LEA [LEA - 나무 위키] 한 줄 요약 -> ROL은 왼쪽 방향 쉬프트 연산이다 [if문 조건식] i^__ROL1__(flag[i], i&7) != arr[i] ROL이 무엇인지도 알았으니 이제 역연산 코드를 짤 수 있을 것 같습니다. 이번에도 브루트 포스 방식으로 if문 조건식을 구현하면 될 듯합니다. #include #include using namespace std; int w; int arr[32]={0x52,0xDF,0xB3,0x60,0xF1,0x8B,0x1C,0xB5,0x57,0..
2021.11.10 -
rev-basic-6 풀이
sub_140001000()에 있는 조건식을 보기 편하게 정리해서 써보겠습니다. byte_140003000을 arr, byte_140003020을 brr, 사용자가 입력한 배열을 flag라고 정의하겠습니다. [if문 조건식] brr[flag[i]]!=arr[i] 저 if문을 다 통과하면 Correct가 출력되므로, 저 조건식을 피해 가는 경우를 계산하면 되겠습니다. brr의 인자 수가 너무 많으니 브루트포싱으로 돌려가며 푸는 게 좋을 듯합니다. (+ 변수 하나를 생성해서 인덱스를 세어주도록 하면 될 것 같기도....) #include #include using namespace std; int arr[]={0x00, 0x4D, 0x51, 0x50, 0xEF, 0xFB, 0xC3, 0xCF, 0x92, 0..
2021.11.03 -
rev-basic-5 풀이
rev-basic-4 문제에서 그랬던 것처럼 byte_140003000안에 들어있는 16진수들로 char형 배열을 만들어줍니다. 그리고 sub_140001000() 함수의 if문 조건식을 보겠습니다. 저번 문제와 동일하게 조건식을 통과하면 Correct 판정이 되는 형식입니다. 이번 문제는 바로 식이 나오지 않아서 직접 배열을 그려가며 풀었습니다 5 4 8 3 2 1 위와 같은 배열이 있을 때 각 배열의 값은 아래와 같을 것입니다. (맨 마지막 인덱스는 0) 1=a[5]+0 2=a[4]+a[5] 3=a[3]+a[4] 8=a[2]+a[3] 4=a[1]+a[2] 5=a[0]+a[1] 이렇게 됐을 때 뒤부터 차례대로 계산을 하게 되면 사용자가 입력한 배열인 a를 알 수 있게 됩니다. 주어진 Hex로 예시를 들..
2021.11.03 -
rev-basic-4 풀이
sub_140001000() 함수의 return값에 따라서 Correct, Wrong가 결정되므로 함수 안에 들어있는 for문을 분석하겠습니다. 그리고 for문을 돌리는 횟수가 0x1C(10진수로 28)인데, byte_140003000에 들어있는 16진수가 기준인 듯합니다. if문에 들어있는 수식에 해당되지 않는다면 Correct가 나오게 됩니다. [if문에 들어있는 수식] (arr[i]4 이제 이 수식을 기반으로 C++ 코드를 짜 보겠습니다. 별다른 역연산은 필요하지 않을 듯합니다. #include #include using namespace std; unsigned char arr[28]={0x24,0x27,0x13,0xC6,0xC6,0x13,0x16,0xE6,0x47,0xF5,0x26,0x96,0x..
2021.10.29 -
rev-basic-3 풀이
sub_1400011B0(), sub_140001210() 함수들은 별로 중요하지 않은 함수이기 때문에 분석은 넘어가겠습니다. sub_140001000() 함수를 보면 for문을 24번 돌려서 xor 연산을 하고 있는 걸 알 수 있습니다. byte_140003000에 뭐가 있는지 확인해보겠습니다. 16진수들이 쭉 나열되어있습니다. 저 수들을 연산하는 것 같은데, sub_140001000() 함수의 return값이 1일 때 Correct가 되므로 if문에 나온 조건식을 역연산하여 코드를 짜고 돌리면 FLAG가 나올 것 같습니다. 코드는 C++로 작성해보겠습니다. #include #include using namespace std; char arr[24]={0x49,0x60,0x67,0x74,0x63,0x6..
2021.10.28