분류 전체보기

Jump aroundThe 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 addresssla(b"> "..
Single User StorageThe 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.sendlineaftersa = r.s..
Emojis on the riseThe 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바이트 값(주소)을 쓸 ..
Tired of math already? Try getting the highest score possible.Bug정답을 맞추지 못하면 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 import *r = ..
Some more basic mathAnalysisround_1x에는 1336, y에는 -1을 넣으면 되는데, 음수를 입력할 수 없기 때문에 -1 대신 0xffffffff를 입력하면 된다.round_2수학적으로는 조건을 만족하는 x와 y를 찾을 수 없지만,x * y를 1337과 비교하는 것은 4바이트 값들 간의 연산이기 때문에 x * y의 하위 4바이트만 1337이면 된다.round_3입력한 수들은 모두 앞의 수보다 작을 수 없고, 다섯 개의 수들을 모두 더한 결과와 모두 곱한 결과가 같아야 한다. 모두 0을 넣으면 통과할 수 있다.Exploit
homeb0dy
'분류 전체보기' 카테고리의 글 목록