Karatus
[pwnable.xyz] Dirty Turtle
문제 풀이 환경 : Ubuntu 16.04 📝 Analysis > RELRO, PIE가 없다. · main 이게 다인 프로그램이다. 사용자가 원하는 주소에 원하는 값을 단 하나 넣을 수 있게 하고 프로그램을 종료시킨다. 미티게이션에서 RELRO가 없지만 GOT Overwrite를 사용할 수는 없을 것 같다. 이때 문제에서 준 힌트를 이용할 수 있다. 파이썬 문법으로 결괏값이 DTORS라고 나온다. ▶ What is DTORS? 더보기 https://woosunbi.tistory.com/89 ctors, dtors section GNU Compiler 는 컴파일 시 .ctors, .dtors section 을 생성한다. .ctors 속성의 함수는 main() 전에 실행되고, .dtors 속성의 함수는 ma..
[pwnable.xyz] Hero Factory
문제 풀이 환경 : Ubuntu 16.04 📝 Analysis > PIE만 안 걸려있다. · createHero unsigned __int64 createHero() { char *v0; // rax int v1; // eax int size; // [rsp+4h] [rbp-7Ch] char buf[96]; // [rsp+10h] [rbp-70h] BYREF int v5; // [rsp+70h] [rbp-10h] unsigned __int64 v6; // [rsp+78h] [rbp-8h] v6 = __readfsqword(0x28u); memset(buf, 0, sizeof(buf)); v5 = 0; if ( is_hero_setted ) { puts("Br0, you already have a hero..
[pwnable.xyz] note v2
문제 풀이 환경 : Ubuntu 16.04 UAF 📝 Analysis > · make_note 이번 문제의 핵심이 되는 함수다. vuln이라고 주석을 달아놓은 곳이 문제인데, malloc을 새로 할당해주려고 하지만 이미 값이 있다면 그냥 그 값을 써버 린다는 점이다. 즉 UAF 취약점이다. malloc과 free에 의한 동작을 정확히 알고 있다면 이번 문제는 쉽다. · delete_note 이 함수는 희한하게 title 부분의 청크는 해제하지 않고 note 내용이 있는 청크만 해제한다. malloc 할당시 title 청크를 조작해줄 수 있는 여지를 제공해준 것이나 마찬가지다. ▶ 나머지 함수는 딱히 필요하지 않다. ✨ Thinking 먼저 할당하는 구조를 살펴보자. free로 아무 청크도 해제하지 않고 ..
[pwnable.xyz] badayum
문제 풀이 환경 : Ubuntu 16.04 📝 Analysis > ※ 함수 이름은 제가 임의로 지었습니다. · main 별거 없다. · set_words 저기에 있는 단어 세트들 중에서 랜덤하게 20개를 뽑아서 사이사이에 '-'를 넣고 해당 청크를 리턴해준다. · play set_words 함수에서 받은 청크 내 문자열 길이 + 1만큼 스택에 있는 s 영역에 사용자가 입력할 수 있다. 몇 번 손으로 프로그램을 돌려보면 알겠지만 문자열의 길이가 s 영역의 길이보다 길어질 수 있다는 걸 알 수 있다. 이는 BOF 취약점으로 이어져 미티게이션을 우회해 내가 원하는 주소로 ret을 할 수 있다는 걸 직감할 수 있다. ✨ Thinking 정말 간단하다. canary와 pie_base leak하기, 얻은 결과로 w..
[pwnable.xyz] password
문제 풀이 환경 : Ubuntu 16.04 아주 골 때리는.. 아니 게싱 문제다. 📝 Analysis > · main int __cdecl __noreturn main(int argc, const char **argv, const char **envp) { int select; // eax int id; // [rsp+0h] [rbp-20h] size_t n; // [rsp+8h] [rbp-18h] BYREF void *s; // [rsp+10h] [rbp-10h] unsigned __int64 v7; // [rsp+18h] [rbp-8h] v7 = __readfsqword(0x28u); setup(); puts("Secure login."); printf("User ID: "); id = (unsign..
[pwnable.xyz] executioner v2
문제 풀이 환경 : Ubuntu 16.04 solve_pow가 더 어렵.. 📝 Analysis > 역시나 · main 이전하고 비슷한 모양새를 하고 있지만 단 16Byte만을 입력으로 받을 수 있다. 참고로 초록색으로 하이라이트 된 곳은 어셈블리어로 다음과 같다. 몇 레지스터를 제외하고는 다 0으로 초기화해주고 있다. 이후 rdx에 저장된 주소를 call 한다. · solve_pow 개인적으로 어려워서 고민하다가 다른 사람 롸업보고 푼 부분. (이미 gdb 디버깅을 통해 내가 짠 shellcode의 PoC는 해놓은 상태에서 봤다.) 사실 데이터 형 크기 고정으로 인한 로직 버그라는 건 인지하고 있었지만 계산을 어떻게 할까 고민하고 있었다. 연산 후 범위를 넘어가는 byte에 대해서는 완전히 생각지도 못하..
[pwnable.xyz] executioner
문제 풀이 환경 : Ubuntu 16.04 간단한 쉘코딩 문제다. 📝 Analysis > 역시 풀밭이다. · main 처음에 solve_pow라는 함수를 부르고 이후 key 전역 변수를 랜덤한 값으로 꽉 채운다. 그리고 이 값을 가지고 사용자가 입력과 xor한다. mmap을 통해 실행 권한을 가진 영역에 결괏값을 저장하고 실행한다(jmp rax). · solve_pow 뭔가 특별해 보이지만 그냥 단순한 문제풀이에 둘 중 하나의 값은 얻은 값, 다른 하나는 0으로 주면 기다리지 않고 그냥 끝난다... ✨ Thinking 입력값과 xor 될 key 값을 조작할 방법이 없어 보이지만 pwnable.xyz에서 나온 다른 여타 문제처럼 strlen 함수가 말썽이다. 만약 내가 첫 바이트를 null로 준다면 xor..
[pwnable.xyz] catalog
문제 풀이 환경 : Ubuntu 16.04 (간단한 평, 안 적어도 무방) 📝 Analysis > · main 누가 봐도 3번 메뉴에서 부르는 함수의 포인터를 조작해서 호출해주는 게 목표다. 그렇다면 이용할 수 있는 건 write_name, edit_name 함수라고 판단되며, 살펴보자. · write_name 0x30 크기의 chunk를 할당하고 그 안에서 사용자가 이름을 입력하게 한다. 입력 크기는 처음 만들 당시에는 하드 코딩된 사이즈인 0x20만큼 입력하고 edit_name 함수로 저장한다. 이후 사용자가 입력한 크기를 다시 조사하여 그 크기를 저장한다. · edit_name 전달받은 포인터에서 안에 저장된 크기만큼 입력한다. ✨ Thinking edit_name 함수에서 name size에 저장..
[pwnable.xyz] bookmark
문제 풀이 환경 : Ubuntu 16.04 간단한 문제다. 📝 Analysis > 난 풀밭이 싫다. · main check 전역 변수의 값이 0이 아니라면 win 함수를 호출하니 여기를 부를 수 있도록 하면 된다. 조작할 수 있는 공격 벡터가 존재하는 곳은 딱 봐도 2번 메뉴밖에 없어 보인다. · create_rul bm에 처음 프로토콜 종류를 입력하고 secure인지 판단하고 그다음 character부터 ': or /'가 안 나올 때까지 뒤로 간다. 그렇게 그 부분을 찾은 다음에 사용자가 제한된 크기 안에서 입력하고 싶은 값을 입력하고 bm부터 훑었을 때 가장 처음 null byte가 나오는 곳부터 입력한 값을 붙여준다. ✨ Thinking 현재 bss 구조다. 이 부분의 로직 에러를 이용해서 계속 뒤..
[pwnable.xyz] rwsr
문제 풀이 환경 : Ubuntu 18.04 임의의 읽기, 쓰기가 주어졌을 때 뭘 타깃으로 할 거냐고 묻고 있다. 📝 Analysis > · main 메뉴 0: return 부르고 종료한다. 메뉴 1: 임의의 주소 읽기 (read) 메뉴 2: 임의의 주소 쓰기 (write) ✨ Thinking 메뉴 1, 2가 있는 것만으로도 세상을 다 가진 기분으로 익스를 할 수 있다. 미티게이션을 확인해보면 PIE 빼고 다 걸려있다. 즉 got overwirte로는 간단히 끝낼 수 없다는 뜻이다. 그래서 메뉴 0번이 눈에 띄었다. main 함수의 ret 부분을 win 함수로 덮어주고 메뉴 0번을 호출한다면 끝날 것 같았다. 그렇다면 어떻게 그 주소를 leak 할 수 있을까 생각해보면 우리에게는 environ 포인터가 있..