[pwnable.xyz] strcat
Wargame/pwnable.xyz
Who needs a name extending service? That's probably vulnerable.AttachmentThe Bugmain()에서 format string bug가 연속으로 두 번 발생한다.Exploitmain()의 rsp에 rsp+0xf0의 값이 저장되어 있다. 첫 번째 FSB로 이 위치에 임의의 주소를 쓰고, 두 번째 FSB로 그 주소에 임의의 값을 쓸 수 있다.putchar()의 GOT를 win()의 주소로 덮어쓰면 플래그를 획득할 수 있다.desc의 중간에 null terminator가 삽입되지 않도록 name의 길이를 충분히 길게 설정해야 한다.from pwn import *r = remote("svc.pwnable.xyz", 30013)sla = r.sendline..
[pwnable.xyz] J-U-M-P
Wargame/pwnable.xyz
Jump aroundAttachmentThe Bugread_int8()에서 1바이트만큼 overflow가 발생한다. 이를 이용하여 main()의 rbp의 하위 1바이트를 임의의 값으로 조작할 수 있다.read_int8()의 return value는 rbp+0x11에 저장된다. rbp를 조작할 수 있기 때문에 결과적으로 main()의 스택 프레임에서 임의의 1바이트를 임의의 값으로 조작할 수 있다.Exploit원래 점프할 주소는 main+22인데, 마지막 1바이트를 0x77로 조작하면 win()으로 점프할 수 있다.from pwn import *r = remote("svc.pwnable.xyz", 30012)sla = r.sendlineaftersa = r.sendafter# get stack addres..
[pwnable.xyz] SUS
Wargame/pwnable.xyz
Single User StorageAttachmentThe Bugcreate_user()에서 지역 변수인 name의 주소를 cur에 넣는다. create_user()가 종료된 이후에 cur에 접근하면 더 이상 존재하지 않는 스택 프레임에 접근하게 된다.Exploitedit_usr()에서 age를 입력받기 위해 read_int32()를 호출하는데, 이때 스택에 저장된 cur의 name 포인터를 덮어쓸 수 있다.name 포인터를 임의의 주소로 덮어쓰면 그 주소에 임의의 0x20바이트 값을 입력할 수 있다. atoi()의 GOT에 win()의 주소를 넣으면 플래그를 획득할 수 있다.from pwn import *r = remote("svc.pwnable.xyz", 30011)sla = r.sendlineaft..
[pwnable.xyz] fspoo
Wargame/pwnable.xyz
Emojis on the riseAttachmentThe Bugfmt는 %s 앞에 7바이트가 추가된 format string이다.cmd[0x30]에는 최대 0x1f바이트까지 입력할 수 있기 때문에 sprintf()로 cmd에 복사되는 문자열의 길이는 최대 0x26바이트이다.따라서 cmd[0x20]부터는 임의의 문자열로 채울 수 있고, format string bug가 발생한다.ExploitGet stack addressvuln()의 SFP (main()의 ebp)를 leak하여 stack address를 구할 수 있다.Get PIE basevuln()의 return address를 leak하여 PIE base를 구할 수 있다.Arbitrary address writeop를 이용하여 스택에 임의의 4바이트..
[pwnable.xyz] Game
Wargame/pwnable.xyz
Tired of math already? Try getting the highest score possible.AttachmentBug정답을 맞추지 못하면 cur->score가 1 감소한다.만약 cur->score가 0이었다면 메모리 상에서 0xffff가 된다.save_game()에서 score를 저장할 때 unsigned short인 cur->score를 8바이트로 캐스팅하는데,이때 signed extension이 진행되어,메모리 상에 0xffffffffffffffff로 저장된다.edit_name()에서 strlen(cur)만큼 read()로 입력을 받는데, score 필드에 null byte가 없기 때문에 play 함수 포인터를 임의의 3바이트 값으로 덮어쓸 수 있다.Exploitfrom pwn im..
h0meb0dy_
'Wargame' 카테고리의 글 목록 (9 Page)