본문 바로가기

반응형

전체 글

(73)
[Dream Hack - Pwnable] baby-bof Buffer Over Flow 프로그램이 특정 크기의 메모리 버퍼를 넘어서 데이터를 쓸 때 발생 취약점은 공격자가 악의적인 코드를 실행하거나 시스템의 동작을 변조하는 데 이용가능 풀이방법 1. name을 입력받아서 작성 | 7ffdc4799ed0 | 7ffdc4799ed8 | 에 입력한 데이터가 stack 안에 저장되고 있는 것을 확인할 수 있다. $ nc host3.dreamhack.games 17378 the main function doesn't call win function (0x40125b)! name: AAAAAAAAA GM GA GE GV AAAAAAAAA!! : | addr| value| | 7ffdc4799ed0| 4141414141414141| | 7ffdc4799ed8| 400041..
[Dream Hack - Crypto] RSA-wiener Wiener 공격 위너(Wiener)의 공격은 RSA 암호화 방식에서 발생하는 취약성을 이용한 공격 기법 중 하나이다. RSA는 공개키 암호화 알고리즘으로 널리 사용되며, 큰 소수인 두 개의 소수를 기반을 한다. 하지만 위너의 공격은 특정 조건이 충족될 때, RSA의 개인키를 복구하는 데 사용될 수 있다. 위너의 공격은 다음과 같은 전제 조건을 필요로 한다: 소수 p와 q가 n = p x q로부터 계산되었을 때, p와 q의 크기가 너무 작아 n을 계산하는 데 상당한 비용이 들지 않는 경우. e가 매우 큰 경우. 보통 RSA에서는 공개 지수 e로 작은 소수, 주로 3 또는 65537(2^16 + 1)을 사용합니다. 하지만 e가 매우 큰 경우에는 위너의 공격이 적용될 수 있다. 위 조건을 충족하는 경우, 위..
[Dream Hack - Crypto] fuzzy flag 풀이 방법 1. flag에 0~51 중 하나의 숫자가 램던으로 더해지는 형태이다. 따라서 flag의 ascii 코드 값 보다 작은 값은 출력될 수 있다. fuzzy = [c + randbelow(len(string.ascii_letters)) for c in flag] 2. 여러번 반복하여 각 index의 가장 작은 값만 저장한다. 3. 작은 값만 저장된 리스트를 변환하면! flag를 얻을 수 있다. 풀이 코드 from pwn import * import time ## 185 글자 min_data_list = [255] * 185 for count in range(0, 216) : p = remote("host3.dreamhack.games", 21384) data = p.recvline().decode..
[Dream Hack - Crypto] chinese what? 풀이 과정 M 계산: M은 모든 pi (여기서는 p1, p2, p3) 값을 곱한 값입니다. M = p1 * p2 * p3 mi 계산: mi는 M을 해당 소수 pi로 나눈 몫입니다. m1 = M // p1, m2 = M // p2, m3 = M // p3 역원 계산: mi의 역원 yi는 mi를 모듈로 pi로 나눈 나머지와 곱했을 때 1이 되는 값입니다. 역원은 모듈로 연산에서 나눗셈의 역할을 합니다. 역원은 확장된 유클리드 알고리즘 등을 사용하여 계산할 수 있습니다. 복원: 이제 역원과 mi 값을 사용하여 flag 값을 복원합니다. flag = (c1 * y1 * m1 + c2 * y2 * m2 + c3 * y3 * m3) % M 풀이 코드 from Crypto.Util.number import long_..
[Dream Hack - Crypto] ICM2022 풀이 과정 1. enc 함수에서 q 값은 다음과 같은 식을 만족한다. 2. n = 3, key2 = 95 일때, q = -200640142664324295933714 을 만족하는 p, key1 을 구하자! 3. key1 < key2 이므로 0 ≤ key1 < 95 이고, 임의의 key1 값에 대한 p 값을 확인하여 flag를 추론하자!! 4. p 값을 확인하는 dec 함수는 다음과 같은 식을 만족한다. 5. dec 를 통해 p 를 구하고, enc 에 p 를 대입하여 q_test 구한 후 기존 p 값과 비교한다. 풀이 코드 import random from fractions import Fraction # 주어진 값 p를 n, key1, key2를 사용하여 암호화하는 함수 def enc(p, n, key1..
[Dream Hack - Crypto] darimchal_001 문제 해석 pwd ^ KEY = JOKER 를 만족하면 복호화가 된다. 코드 해석 #include #include #include // 초기화된 값으로 정의한 문자열 상수들 #define JOKER "\\x40\\x53\\x06\\x03\\x43\\x52\\x54\\x3b" #define KEY "023661dd4\\0" #define TRUE 1 #define FALSE 0 #define OK 0 #define ERRO -1 // 소프트웨어 이름과 사용 방법을 출력하는 함수 void __print_sw_title (char *sw_name); // 주어진 비밀번호가 유효한지 확인하는 함수 int __is_valid_pwd (char *pwd); // 주어진 비밀번호를 키를 이용해 난독화하는 함수 cha..
[Dream Hack - Crypto] ROT128 문제 해석 flag.png 를 제공된 코드로 암호화하여 encfile 을 작성하였다. png 파일을 128byte 만큼 오른쪽으로 밀어서 utf-8로 인코딩 된 암호화 파일을 생성한다. 암호화된 파일을 byte 단위로 읽어와 다시 왼쪽으로 128byte 만큼 밀어 bin 파일을 생성한다. 코드 해석 # 초기 0부터 255까지의 숫자를 16진수로 표현한 리스트를 생성합니다. hex_list = [(hex(i)[2:].zfill(2).upper()) for i in range(256)] # print(hex_list) # 'flag.png' 파일을 바이너리 모드로 열어서 내용을 읽어옵니다. with open('flag.png', 'rb') as f: plain_s = f.read() # 'plain_s' 바..
[Dream Hack - Crypto] Robot Only 풀이 방법 로봇임을 인증 출력되는 토큰을 재입력 배팅을 통해 돈을 범배팅하는 돈이 가지고 있는 돈보다 작거나 같으면 되는 것을 확인. 음수의 돈을 배팅하여 배팅에서 지는 경우, money - bet 식을 통해 오히려 돈을 얻을 수 있는 것을 확인 bet = int(input('how much money do you want to bet (your money: ${0})? '.format(money))) if money < bet: print('you don\\'t have enough money (your money: ${0}).'.format(money)) return 돈주고 flag를 산다. 코드 from pwn import * import time p = remote("host3.dreamhack...

반응형