목록전체 글 (67)
Hack4S3cur1ty
대충 번역기 돌려보면 뭔소린지 모르겠다. nc 접속해보면 사칙연산 100스테이지 깨는거같아서 코드를 짰다. 12345678910111213141516171819202122232425from socket import * HOST = 'tekeisan-ekusutoriim.chall.beginners.seccon.jp'PORT = 8690 s = socket(AF_INET, SOCK_STREAM)s.connect((HOST,PORT)) def read_until(check): buffer = '' while check not in buffer: buffer += s.recv(1) return buffer read_until('----------------------------------------------..
N, E, C 값이 주어졌는데, factordb에서 N값을 인수분해 해보면 p와 q를 구할 수 있다. 12345678910111213141516171819202122232425from Crypto.Util.number import long_to_bytes def xgcd(b, n): x0, x1, y0, y1 = 1, 0, 0, 1 while n != 0: q, b, n = b // n, n, b % n x0, x1 = x1, x0 - q * x1 y0, y1 = y1, y0 - q * y1 return b, x0, y0 def mulinv(b, n): g, x, _ = xgcd(b, n) if g == 1: return x % n p = 299681192390656691733849646142066664..
바이너리를 까보면 간단한 연산을 하는데 angr로 풀면 슥삭이다. 1234567891011import angr def main(): p = angr.Project("simple_auth", load_options={'auto_load_libs': False}) ex = p.surveyors.Explorer(find=(0x4007DF, ), avoid=(0x400801,)) ex.run() return ex.found[0].state.posix.dumps(0).strip('\0\n') if __name__ == '__main__': print main()Colored by Color Scriptercs
바이너리를 IDA로 까보면 값을 입력받고 연산을 거친뒤 해당 연산에 맞는 플래그를 알려준다. 디버깅 하면 쉽게 구할 수 있을거같지만 귀찮고 연산이 짧으니 정적분석으로 풀었다. 첫번째 연산을 보면 테이블이 있고 테이블 값과 0xFF를 xor 연산을 하면서 비교한다. 비교에 실패하면 flag값 처럼 1을 리턴한다 그 후 0xFF에 다시 특정값을 xor 한 뒤 그 값을 다음 테이블 값과 연산한다. 두번째 연산도 같은 방식이다. 간단하게 파이썬 코드를 짜서 풀 수 있다. 123456789101112131415161718192021222324252627282930table = [0x9C, 0x9E, 0x8C, 0x3E, 0x68, 0x64, 0x7B, 0x3F, 0x50, 0x63, 0x0A, 0x7F, 0x55..
파일을 받아 확인해 보니 .net 이었다. dnspy를 키고 분석해보니 난독화를 해놔서 드러웠지만 상관없다. dnspy로 디버깅 하면서 보면 된다. 대충 보면 먼저 특정 드라이브 검색 후 특정 파일이 있나 확인하는데 그냥 NOP로 처리해버리면 된다. 그 후 시리얼키를 받고 AES 암호화 후 어떤 값과 비교하는데 브포 걸고 디버깅 해보면 비교값을 알 수 있다. IV와 KEY가 테이블에 저장되어 있고 간단한 연산을 하기 때문에 쉽게 구할 수 있고, 비교값을 AES Decrypt 하면 플래그를 구할 수 있다. 1234567891011121314151617181920212223242526272829303132333435import binasciifrom Crypto.Cipher import AES def get..