목록2026/03 (15)
graf
허스키 사용법을 한번 정리할 필요가 있을 것 같다. 1. 기본 설정import chipwhisperer as cwtry: if not scope.connectStatus: scope.con()except NameError: scope = cw.scope()print("INFO: ChipWhisperer connection finished") scope 객체 생성 및 연결 수행 scope.default_setup() 파라미터 기본값 설정허스키 연결 직후 한번은 실행해놓는게 거의 표준이라고 한다. def reboot_flush(): scope.io.nrst = False time.sleep(0.25) scope.io.nrst = "high_z" time...
1. 개요그동안은 모두 클럭 글리칭을 사용했다. 이는 결함을 정밀하게 발생시킬 수 있다는 장점이 있긴 하지만 최근 나오는 대부분의 장비들은 pll이 고속 클럭을 다 씹는다고 알고 있다. 클럭 글리칭은 외부 클럭을 주입할 수 있을 때 활용 가능하기 때문에 대상 장치가 내부 클럭을 사용하거나 pll을 쓴다면 활용이 어려워진다. 이번에 시도할 것은 볼트 글리칭이다. 클럭 방식만큼 정밀하진 않지만 훨씬 범용적으로 활용 가능하다. 내가 계획 중인 것도 이 쪽이다. scope.io.glitch_hp = True #enable HP glitchscope.io.glitch_hp = False #disable LP glitchscope.io.glitch_lp = True #enable LP glitchscope..
1. 개요Hopefully you got at least one glitch that looks like the authenticated version of the encryption. We were able to use the return message to narrow down our glitches, but these other glitches shows that power traces are still very useful here.Now that we know where to insert a glitch to bypass the authentication, we could use one of those attacks on unauthenticated encryption. Instead, let'..
1. 개요 이번 목표는 인증 우회다. AES 인증을 우회하여 펌웨어를 업로드하는 것이 목표라고 한다. 내 목표도 secure boot 우회였으니 이번에 배울 점이 정말 많겠다. 이번엔 CPA 공격을 할 줄 알아야 한다고 한다. 이건.. 할 줄 모르는데... 그렇다고 SCA 문서를 다 공부하고 글리칭을 시작하는건 주객전도인 것 같고,, 일단 그냥 이어서 해보자. 모르는 내용이 나오면 공부하면서 진행해봐야겠다. 2. 기본 설정calc_crc = cw.targets.SimpleSerial2._calc_crcprint(calc_crc([0x00, 0x12])) crc를 계산하는 함수다. 현재 대상 장치에서도 인증 정보로 8비트 crc를 사용하고 있다. 여기선 simpleSerial2의 내부 구..
1. 개요 제목에서 알 수 있듯이 이번엔 메모리 덤프다. 이번엔 부트로더 쪽이 표적인 것 같다. 이번에도 꼼꼼하게 진행해보자. 현재 상황에 대한 가정이다. 516261276720736265747267206762206f686c207a76797821 현재 원문을 알 수 없는 이 암호화 데이터를 확보한 상태다. p 명령어를 통해 암호화된 펌웨어를 입력하면 장치는 이를 저장한다. 데이터를 복호화 후 메모리에 저장하는 동작을 수행하는 것으로 추정된다. 복호화 동작을 수행한 다음엔 적절한 에러 코드를 반환한다. 펌웨어 코드가 찾으면 나오긴 하겠지만 자료에서 언급한 것과 같이 이번엔 내부 상황을 알 수 없다고 가정하고 진행해보자. 유일한 전제는 에러 코드가 반환되기 전에 트리거가 발생한다는 것 뿐이다. ..
나는 지금 몹시 화가 나있다. 현재 프로그램의 동작 방식이 jupyter 서버를 생성하고브라우저로 접속해서 허스키와 통신하는 형태인데 접속이 불안정한지 이렇게 갑자기 코드가 안보이거나 연결 자체가 끊어지거나 하는 일이 벌써 몇 차례나 발생했다. 새로고침하면 괜찮아져서 지금까지는 잘 썼는데 글리칭 도중에 죽어버리니 정말 큰 분노가 느껴진다. 빌어먹을 몇시간이 날아간거야 사진 찍으려니 멀쩡하네 개같은거 아무튼 주피터 데스크탑이 있다길래 이걸 써보려고 한다. 적어도 브라우저보다는 안정적으로 연결할 수 있겠지. JupyterLab Desktop 윈도우 파일로 다운받았다. 폴더를 가져오면 일단 잘 열리긴 하는데 코드를 실행하니 모듈이 없다고 나온다. 환경이 맞춰지질 않아서 그런가보다. ..
1. 개요 이번에 시도하는 것은 패스워드 검증 우회다. 펌웨어는 이전과 동일하다. uint8_t password(uint8_t* pw, uint8_t len){ char passwd[] = "touch"; char passok = 1; int cnt; trigger_high(); //Simple test - doesn't check for too-long password! for(cnt = 0; cnt 이번에 시도하는 건 이 부분이다. 패스워드를 입력 후 일치 여부를 반환하는 동작을 한다. reboot_flush()pw = bytearray([0x74, 0x6F, 0x75, 0x63, 0x68]) # correct password ASCII representation..
※ 라이브러리 코드 전부 다 열어볼거라 많이 지저분합니다. 원래 워게임 풀이 거의 안 올리는데 드림핵에 올리려고 기껏 정리한 게 길이 제한 때문인지 업로드가 안돼서 버리기 아까워서 가져왔다. 1. 문제 코드 확인// Name: bypass_valid_vtable// gcc -o bypass_valid_vtable bypass_valid_vtable.c -no-pie#include #include FILE *fp;void init() { setvbuf(stdin, 0, 2, 0); setvbuf(stdout, 0, 2, 0);}int main() { init(); fp = fopen("/dev/urandom", "r"); printf("stdout: %p\n", stdout); printf..