Writeup 2026_0827
wrong instruction - AlpacaHack
binary ninjaでごちゃごちゃやった気がしますので、また後で書きます。
Flag is A+B - AlpacaHack
A or BとA xor Bの値だけわかるので、A+Bの値を復元する。
A + B = A xor B + 2 * (A and B)で、
A and B = A or B - A xor Bなので、
A + B = A xor B + 2 * (A or B - A xor B)
1 | OR = 1708520672692343497693425015709016883325158039728511260268583494549501 |
1 |
|
choiceの値をいい感じにして、win()を実行する。
objdumpすると
1 | 0000000000401257 <vuln>: |
で、
スタック配置は以下のようになっています。
1 | [rbp + 0x08] return adress |
1 | mov -0x20(%rbp,%rax,8), %rdx |
rbp - 0x20 + input * 8で計算した値を関数アドレスとして呼び出している。rbp - 0x20 + input * 8をrbp + 0x08にできれば、main()内のwin()を実行することができそう。rbp - 0x20 + input * 8 = rbp + 0x08を計算すると
input = 5なので、5を入れる。
glibc’s secret function - AlpacaHack
1 |
|
memfrob(void *mem, size_t length)が、mem からはじまる length バイトの領域に対し、1 バイトごとに 42 との排他的論理和を計算して上書きするものらしいので、
expectedに対しても同じことをするとフラグを取得できました。
Writeup 2026_0827