목록분류 전체보기 (105)
또 뭐하지
문제 코드를 살펴보면 scanf("%s",A)에서 입력된 문자열을 변수 'A'에 저장하는데, 이때 길이에 대한 제한이 없다. 따라서 지정된 문자열 길이인 8을 넘기게 되면 변수 'B'의 메모리 영역에 덮어써지게 된다. 이제 어셈블리 코드를 살펴보자. : endbr64 // int main() : push rbp : mov rbp,rsp : sub rsp,0x20 //canary 저장 : mov rax,QWORD PTR fs:0x28 : mov QWORD PTR [rbp-0x8],rax // eax 0으로 초기화 : xor eax,eax // 지역 변수 'A' 초기화, 입력을 받아 'A'에 저장 ..
1. PwnablePwnable(시스템 해킹)운영체제 또는 프로그램 취약점을 찾아 공격하고, 관리자의 권한 등을 얻어 시스템을 장악하거나 의도치 않은 행동을 하게 하는 것컴퓨터 프로그램의 행위를 조작하여 공격자가 원하는 행동을 실행하도록 하는 공격궁극적으로 관리자 권한 탈취가 공격의 목표취약점 종류Memory Corruption : Buffer Overflow, Out-Of-Boundary, Off-by-one, Format String Bug, Double Free/User-After-FreeLogical Bug : Command Injection, Race Condition, Path Traversal(경로 탐색)해킹 과정취약점 발견 -> 공격 시나리오 작성 -> 필요 정보 수집 및 공격 -> 권한 ..
풀이main 함수이다. sub_140001000 함수를 살펴봐야할 것 같다.a1에 -5를 곱한 값이 byte_140003000의 값과 일치하면 된다. 그런데 여기서 unsigned 값을 사용하기 때문에 쉽게 구할 수 는 없을 것 같다. byte_140003000 값을 얻어오자.a = "AC F3 0C 25 A3 10 B7 25 16 C6 B7 BC 07 25 02 D5 C6 11 07 C5 00 00 00 00 00 00 00 00 00 00 00 00"a = a.split()[:21]a = [int(x, 16) for x in a]tmp = []for t in a: for x in range(256): if (x * 251) % 256 == t: tmp..
풀이main 함수이다. sub_140001000 함수를 살펴봐야할 것 같다.__ROL1__(*(_BYTE *)(a1 + i), i & 7)는 읽은 바이트를 왼쪽으로 (i & 7) 비트만큼 회전하는 코드이다. 여기서 & 7 연산은 i 값을 8로 나눈 나머지를 구하는 것과 같으므로, 회전 수는 항상 0에서 7 사이가 된다. __ROL1__은 "Rotate Left" 연산을 의미한다. 해당 연산을 한 후 i와 xor한 값이 byte_140003000 값과 일치하면 조건에 맞는 값이다. byte_140003000을 얻어오자. a = "52 DF B3 60 F1 8B 1C B5 57 D1 9F 38 4B 29 D9 26 7F C9 A3 E9 53 18 4F B8 6A CB 87 58 5B 39 1E"a = a.s..
풀이main 함수이다. 필요한 sub_140001000 함수를 살펴보자.sub_140001000를 살펴보면 byte_140003020 배열의 a1[i]번째의 값이 byte_140003000[i] 값과 동일하면 correct가 출력된다는 것을 알 수 있다. byte_140003020 값과 byte_140003000 값을 가져온다a = "63 7C 77 7B F2 6B 6F C5 30 01 67 2B FE D7 AB 76 CA 82 C9 7D FA 59 47 F0 AD D4 A2 AF 9C A4 72 C0 B7 FD 93 26 36 3F F7 CC 34 A5 E5 F1 71 D8 31 15 04 C7 23 C3 18 96 05 9A 07 12 80 E2 EB 27 B2 75 09 83 2C 1A 1B 6..
풀이main 함수를 보자. 이번에는 sub_140001000 함수를 봐야한다. 함수를 살펴보면 a[i]+a[i+1] 이 byte_140003000의 배열값과 일치하면 된다. 여기서 생각해보면 (byte_140003000의 배열값이 data라고 할 때)data[0] = a[0] + a[1]data[1] = a[1] + a[2]...data[23] = a[23] + a[24]이다. data[23] = 0 인데 a는 unsigned integer이니까 a[23] = a[24] = 0 이어야 data[23] = 0일 수 있는 것을 알 수 있다. byte_140003000에서의 값을 찾아오자. hex_string = "AD D8 CB CB 9D 97 CB C4 92 A1 D2 D7 D2 D6 A8 A5 DC C7..
풀이main 함수이다. sub_140001000 함수을 살펴보자.함수를 살펴보면 byte_140003000에 위치한 배열과 a1의 상위 4비트, 하위 4비트의 위치를 바꾼 값과 비교해서 일치하면 되는 것을 확인할 수 있다. byte_140003000의 배열값을 복사하고, 파이썬 코드를 작성하자. 배열값의 상위 4비트, 하위4비트의 위치를 바꾸면 원하는 값을 얻을 수 있을 것이다. data = bytes.fromhex("24 27 13 C6 C6 13 16 E6 47 F5 26 96 47 F5 46 27 13 26 26 C6 56 F5 C3 C3 F5 E3 E3 00 00 00 00 00")tmp = []for i in range(28): a = (data[i]>4)%256 tmp.append(..
풀이main 함수를 확인해보자. 이번에는 sub_140001000 함수를 확인해보면 correct가 출력되는 입력값을 알 수 있다. 함수를 살펴보면 24까지 for문이 돌고 있고 byte_140003000에 위치한 배열과 (i^a1)+2*i 값을 비교하고 있다. 그러면 우리가 원하는 값은 주소값에 위치한 배열값을 x라고 할 때, (x-2*i)^i 인 것을 알 수 있다. 그러면 이제 x를 구하고 연산하는 파이썬 코드를 작성해보자. byte_140003000로 이동해보면 배열 값을 확인할 수 있다. Hex View로 더 보기좋게 확인할 수 있다. 이 바이트값을 복사해서 연산을 해주자. data = bytes.fromhex("49 60 67 74 63 67 42 66 80 78 69 69 7B 99 6D ..