티스토리 뷰
컴퓨터를 정리하던 중 예전에 다운로드 받았던 리버싱 문제들을 발견했다.
폴더명은 디미고 본선 리버싱50이었는데 정확히 무슨 ctf였는지 모르겠다.
디미ctf 2017 본선 문제였다고한다.
그당시에는 풀지못해서 다운로드만 해놓고 손절했던것같은데 지금보니 쉬운 문제였다.
srand에 seed값으로 0x3FD1CC7을 주기 때문에 고정된 값이 나온다.
즉 그 값들을 테이블로 이용해서 브루트포스를 돌릴 수 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | import string flag="" table=[0x4D,0x0CB,0x0C3,0x0BB,0x19,0x0A,0x1A,0x7F,0x50,0xF8,0x18,0x08,0x89, 0x0C1,0x0A8,0x0CF,0x0BA,0x0BE,0x0EC,0x75,0x90,0x0E2,0x23,0x6D,0x0A4, 0x0B7,0x35,0x0F5,0x0D1,0x9A,0x32,0x1A,0x8E] random_table=[0x29,0xa2,0xae,0xd2,0x7e,0x65,0x61,0x08,0x31,0x8a,0x75, 0x7d,0xf9,0xfe,0xf7,0xa1,0xd5,0xd1,0x83,0x2a,0xf3,0x8d,0x4f,0x09, 0xd1,0xc7,0x6a,0x9c,0xa2,0xf3,0x46,0x25,0xf3,0x7d,0x75,0x7b] for i in range(len(table)): for j in string.printable: k=ord(j) m=(random_table[i]|k)&(~(random_table[i]&k)+256) if m==table[i]: flag+=j print(flag) | cs |
난 처음에 랜덤값 테이블 구하느라 노가다를 했는데 같은 동아리 친구를 통해 seed값만으로 편하게 브루트포스를
돌릴 수 있다는 사실을 알게되었다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | from ctypes import * import string libc = CDLL('msvcrt') flag = "" seed = 0x3FD1CC7 libc.srand(seed) table=[0x4D,0x0CB,0x0C3,0x0BB,0x19,0x0A,0x1A,0x7F,0x50,0x0F8,0x18,0x08,0x89, 0x0C1,0x0A8,0x0CF,0x0BA,0x0BE,0x0EC,0x75,0x90,0x0E2,0x23,0x6D,0x0A4, 0x0B7,0x35,0x0F5,0x0D1,0x9A,0x32,0x1A,0x8E] for i in range(len(table)): v4 = libc.rand() % 256 for j in string.printable: k=ord(j) m=(v4|k) & (~(v4&k)) if m==table[i]: flag+=j print (flag) | cs |
또한 linux와 window는 서로 seed값이 같아도 랜덤값 테이블이 다르게 나온다는 사실도 새로 알았다.
flag= dimigo{warmup?_nooo_coldup_isit?}
'reversing' 카테고리의 다른 글
나보려고 만든 rev,misc 꿀팁 소스 (0) | 2019.03.13 |
---|---|
디미ctf 2018 mm (0) | 2018.11.11 |